- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有 2 个布局文件。一个是默认的,另一个是 sw720dp
。显然,它们共享相同的模型:
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:fresco="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools">
<data>
<import type="java.lang.String" />
<variable
name="product"
type="com.test.test.test.test.Product" />
</data>
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/white"
android:orientation="vertical"
tools:context="com.test.test.test.test.ProductDetailsFragment">
<RelativeLayout
android:id="@+id/ll_custome_action_bar"
android:layout_width="match_parent"
android:layout_height="56dp"
android:background="@color/light_blue_900"
android:orientation="horizontal">
<TextView
android:id="@+id/tv_back_button"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_alignParentLeft="true"
android:layout_alignParentStart="true"
android:gravity="center_vertical"
android:padding="16dp"
android:text="@string/fa_arrow_left"
android:textColor="@color/white"
android:textSize="22sp" />
<TextView
android:id="@+id/tv_product_name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="end"
android:gravity="center"
android:maxLines="1"
android:paddingLeft="46dp"
android:paddingRight="46dp"
android:text="@{product.name}"
android:textColor="@color/white"
android:textSize="18sp" />
</RelativeLayout>
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/vp_product_images"
android:layout_width="match_parent"
android:layout_height="150dp"
android:layout_below="@+id/ll_custome_action_bar"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/placeholder2" />
<Button
android:id="@+id/btn_add_to_card"
android:layout_width="232dp"
android:layout_height="wrap_content"
android:layout_below="@+id/btn_wishlist"
android:layout_centerHorizontal="true"
android:layout_marginBottom="16dp"
android:background="@drawable/selector_button_green"
android:text="@string/add_to_cart"
android:textColor="@color/white"
android:textSize="16sp" />
<Button
android:id="@+id/btn_wishlist"
android:layout_width="232dp"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_price_holder"
android:layout_centerHorizontal="true"
android:layout_marginBottom="16dp"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:background="@drawable/selector_button_red"
android:text="@string/wishlist"
android:textColor="@color/white"
android:textSize="16sp" />
<LinearLayout
android:id="@+id/ll_product_info_holder"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_product_images"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="5dp"
android:background="@drawable/drawable_border"
android:orientation="vertical">
<TextView
android:id="@+id/tv_product_description_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/light_blue_900"
android:gravity="center"
android:padding="3dp"
android:text="@string/description"
android:textColor="@color/white"
android:textSize="16sp" />
<TextView
android:id="@+id/tv_product_description_value"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="16dp"
android:text="@{product.description}"
android:textColor="@color/gray_800"
android:textSize="12sp" />
</LinearLayout>
<LinearLayout
android:id="@+id/ll_price_holder"
android:layout_width="264dp"
android:layout_height="wrap_content"
android:layout_below="@+id/ll_product_info_holder"
android:layout_centerHorizontal="true"
android:gravity="center"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/ll_total_price_holder"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/screen_edge_margin"
android:background="@drawable/drawable_border"
android:orientation="vertical">
<TextView
android:id="@+id/tv_total_price_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/light_blue_900"
android:gravity="center"
android:padding="3dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="@string/basePrice"
android:textColor="@color/white"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/tv_total_price_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@{product.normalPrice}"
android:textColor="@color/gray_800"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/blank_space"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_total_price_currency"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@{product.productionData}"
android:textColor="@color/gray_800"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_your_price_holder"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:layout_margin="@dimen/screen_edge_margin"
android:layout_marginLeft="8dp"
android:layout_marginStart="8dp"
android:background="@drawable/drawable_border"
android:orientation="vertical">
<TextView
android:id="@+id/tv_your_price_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/light_blue_900"
android:gravity="center"
android:padding="3dp"
android:paddingLeft="8dp"
android:paddingRight="8dp"
android:text="@string/yourPrice"
android:textColor="@color/white"
android:textSize="16sp" />
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:padding="16dp">
<TextView
android:id="@+id/tv_your_price_value"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@{product.specialPrice}"
android:textColor="@color/gray_800"
android:textSize="14sp" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/blank_space"
android:textColor="@color/white"
android:textSize="12sp" />
<TextView
android:id="@+id/tv_your_price_currency"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:gravity="center"
android:text="@{product.productionData}"
android:textColor="@color/gray_800"
android:textSize="14sp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
<LinearLayout
android:id="@+id/ll_product_images"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@+id/vp_product_images"
android:layout_marginLeft="16dp"
android:layout_marginRight="16dp"
android:layout_marginTop="20dp"
android:orientation="horizontal">
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/vp_product_image_1"
android:layout_width="100dp"
android:layout_height="70dp"
android:layout_margin="5dp"
android:layout_weight="1"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/placeholder2" />
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/vp_product_image_2"
android:layout_width="100dp"
android:layout_height="70dp"
android:layout_margin="5dp"
android:layout_weight="1"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/placeholder2" />
<com.facebook.drawee.view.SimpleDraweeView
android:id="@+id/vp_product_image_3"
android:layout_width="100dp"
android:layout_height="70dp"
android:layout_margin="5dp"
android:layout_weight="1"
fresco:actualImageScaleType="centerCrop"
fresco:placeholderImage="@drawable/placeholder2" />
</LinearLayout>
</RelativeLayout>
</ScrollView>
然后,在我的 fragment 中,我像这样访问 Binder
public class ProductDetailsFragment extends BaseFragment implements ProductDetailsView {
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
public static final String ACTION_SHOW_ACTION_BAR = ProductDetailsFragment.class.getName() + ".show_action_bar";
public static final String ACTION_HIDE_ACTION_BAR = ProductDetailsFragment.class.getName() + ".hide_action_bar";
public static final String ACTION_BACK = ProductDetailsFragment.class.getName() + ".back";
public static final String ACTION_ADD_TO_CART = ProductDetailsFragment.class.getName() + ".add_to_cart";
public static final String ACTION_ADD_TO_WISHLIST = ProductDetailsFragment.class.getName() + ".add_to_wishlit";
FragmentProductDetailsBinding mBinder;
Shop mShop;
Product mProduct;
ProductDetailsPresenter mPresenter;
PreferenceAdapter mPreferenceAdapter;
public ProductDetailsFragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param product Parameter 1.
* @return A new instance of fragment ProductDetailsFragment.
*/
public static ProductDetailsFragment newInstance(Shop shop, Product product) {
ProductDetailsFragment fragment = new ProductDetailsFragment();
Bundle args = new Bundle();
args.putParcelable(ARG_PARAM1, Parcels.wrap(shop));
args.putParcelable(ARG_PARAM2, Parcels.wrap(product));
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
Parcelable parcelable;
parcelable = getArguments().getParcelable(ARG_PARAM1);
mShop = Parcels.unwrap(parcelable);
parcelable = getArguments().getParcelable(ARG_PARAM2);
mProduct = Parcels.unwrap(parcelable);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_product_details, container, false);
setUIListeners();
mPresenter = new ProductDetailsPresenterImpl(this);
mPreferenceAdapter = new PreferenceAdapter(getContext());
mBinder.setProduct(mProduct);
setImages();
setPriceVisibility();
sendActionToActivity(ACTION_HIDE_ACTION_BAR);
if (isUserLogged()) {
mBinder.btnWishlist.setVisibility(View.VISIBLE);
} else {
mBinder.btnWishlist.setVisibility(View.GONE);
}
return mBinder.getRoot();
}
@Override
public void onDestroyView() {
super.onDestroyView();
mPresenter.cleanup();
sendActionToActivity(ACTION_SHOW_ACTION_BAR);
}
@Override
protected void setTypeface() {
mBinder.tvBackButton.setTypeface(FontManager.getInstance().getFontAwesome());
}
private void setUIListeners() {
mBinder.btnAddToCard.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendActionToActivity(ACTION_ADD_TO_CART, mShop, mProduct);
}
});
mBinder.btnWishlist.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendActionToActivity(ACTION_ADD_TO_WISHLIST, mShop, mProduct);
}
});
mBinder.tvBackButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
sendActionToActivity(ACTION_BACK);
}
});
}
private void setImages() {
String imagePathMax = mPreferenceAdapter.readImagePathMax();
String imagePathNormal = mPreferenceAdapter.readImagePathNormal();
String imageExtension = mPreferenceAdapter.readImageExtension();
String input = mProduct.getId();
input = input.replace(" ", "");
String image = imagePathMax + input + imageExtension;
String image_01 = imagePathNormal + input + "_01" + imageExtension;
String image_02 = imagePathNormal + input + "_02" + imageExtension;
final Uri imageUri = Uri.parse(image);
final Uri image_01Uri = Uri.parse(image_01);
final Uri image_02Uri = Uri.parse(image_02);
mBinder.vpProductImages.setImageURI(imageUri);
mBinder.vpProductImage1.setImageURI(imageUri);
mBinder.vpProductImage2.setImageURI(image_01Uri);
mBinder.vpProductImage3.setImageURI(image_02Uri);
mBinder.vpProductImage1.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBinder.vpProductImages.setImageURI(imageUri);
}
});
mBinder.vpProductImage2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBinder.vpProductImages.setImageURI(image_01Uri);
}
});
mBinder.vpProductImage3.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mBinder.vpProductImages.setImageURI(image_02Uri);
}
});
}
private void setPriceVisibility() {
if (mBinder.getProduct().getNormalPrice().equals(mBinder.getProduct().getSpecialPrice())) {
mBinder.llTotalPriceHolder.setVisibility(View.VISIBLE);
mBinder.llYourPriceHolder.setVisibility(View.GONE);
} else {
mBinder.llTotalPriceHolder.setVisibility(View.VISIBLE);
mBinder.llYourPriceHolder.setVisibility(View.VISIBLE);
}
}
@Override
public void logoutShop(Shop shop) {
}
@Override
public void showError(Error error) {
}
@Override
public void showProgress(boolean show) {
}
private void sendActionToActivity(String action) {
if (mListener == null) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(Constants.ACTION_KEY, action);
mListener.onFragmentInteraction(bundle);
}
private void sendActionToActivity(String action, Shop shop, Product product) {
if (mListener == null) {
return;
}
Bundle bundle = new Bundle();
bundle.putString(Constants.ACTION_KEY, action);
bundle.putParcelable(Constants.DATA_KEY_1, Parcels.wrap(shop));
bundle.putParcelable(Constants.DATA_KEY_2, Parcels.wrap(product));
mListener.onFragmentInteraction(bundle);
}
public void logoutShop() {
AsyncExecutor.create().execute(new AsyncExecutor.RunnableEx() {
@Override
public void run() throws Exception {
mPresenter.logoutShop(mShop);
ShopRepository shopRepository;
shopRepository = new ShopRepository();
mShop.setLoginId(-1);
mShop.setCustomerId(-1);
mShop.setCartNumber(0);
mShop.setLineNumber(0);
mShop.setCartItems(0);
shopRepository.updateLoginNumber(mShop);
shopRepository.updateCart(mShop);
notifyChanges();
}
});
}
private boolean isUserLogged() {
return mShop != null && mShop.getLoginId() != -1;
}
private void notifyChanges() {
AuthShopResult event;
event = new AuthShopResult();
event.setShop(mShop);
EventBus.getDefault().post(event);
}
}
但是,当我尝试在平板电脑上运行我的应用程序并希望使用其他布局时,我在 Binder 中遇到错误。
C:\ProductDetailsFragment.java Error:(179, 65) error: cannot find symbol method getProduct() Error:(179, 20) error: cannot find symbol method getProduct() Error:Execution failed for task ':app:compileDebugJavaWithJavac'. Compilation failed; see the compiler error output for details. Information:BUILD FAILED Information:Total time: 6.231 secs Information:3 errors Information:0 warnings Information:See complete output in console
getProduct()
错误可以在setPriceVisibility()
方法中找到。
据我所知,FragmentProductDetailsBinding mBinder
仅指标准布局,但 sw720dp 布局没有 Binder 。我该如何解决这个问题?
编辑:我添加了以下内容:
FragmentProductDetailsBindingSw720dpImpl mBinder720;
mBinder720 = DataBindingUtil.inflate(inflater, R.layout.fragment_product_details, container, false);
mBinder720.setProduct(mProduct);
mBinder720.getProduct().getNormalPrice().equals(mBinder720.getProduct().getSpecialPrice())
这种方式我有两个 Binder 并且它有效,但必须有更好的方式。
编辑 2: 我已将问题发布到 Android bug tracker , 如果您有任何建议,请随时指正。
最佳答案
出于某种原因,getter 未在绑定(bind)类 FragmentProductDetailsBinding
上定义,就像它是 documented :
The generated binding class will have a setter and getter for each of the described variables. The variables will take the default Java values until the setter is called —
null
for reference types,0
forint
,false
forboolean
, etc.
*Impl
类扩展此类并定义此 getter 方法,同时重写 setter。所以我认为这是数据绑定(bind)生成方面的错误。
在您的情况下,您可以通过直接使用 Fragment
中的 mProduct
来解决此问题。
关于android - DataBinding Binder 不适用于具有不同限定符的 2 个相同布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41263667/
我在我的 Xcode 项目目录中输入了以下内容: keytool -genkey -v -keystore release.keystore -alias mykey -keyalg RSA \
假设我有一个像这样的 DataFrame(或 Series): Value 0 0.5 1 0.8 2 -0.2 3 None 4 None 5 None
我正在对一个 Pandas 系列进行相对繁重的应用。有什么方法可以返回一些打印反馈,说明每次调用函数时在函数内部进行打印还有多远? 最佳答案 您可以使用跟踪器包装您的函数。以下两个示例,一个基于完成的
我有一个 DataFrame,其中一列包含列表作为单元格内容,如下所示: import pandas as pd df = pd.DataFrame({ 'col_lists': [[1, 2
我想使用 Pandas df.apply 但仅限于某些行 作为一个例子,我想做这样的事情,但我的实际问题有点复杂: import pandas as pd import math z = pd.Dat
我有以下 Pandas 数据框 id dist ds 0 0 0 0 5 1 0 0 7 2 0 0
这发生在我尝试使用 Gradle 构建时。由于字符串是对象,因此似乎没有理由发生此错误: No signature of method: java.util.HashMap.getOrDefault(
您好,有人可以解释为什么在 remaining() 函数中的 Backbone 示例应用程序 ( http://backbonejs.org/examples/todos/index.html ) 中
我有两个域类:用户 class User { String username String password String email Date dateCreated
问题陈述: 一个 pandas dataframe 列系列,same_group 需要根据两个现有列 row 和 col 的值从 bool 值创建。如果两个值在字典 memberships 中具有相似
apporable 报告以下错误: error: unknown type name 'MKMapItem'; did you mean 'MKMapView'? MKMapItem* destina
我有一个带有地址列的大型 DataFrame: data addr 0 0.617964 IN,Krishnagiri,635115 1 0.635428 IN,Chennai
我有一个列表list,里面有这样的项目 ElementA: Number=1, Version=1 ElementB: Number=1, Version=2 ElementC: Number=1,
我正在编译我的源代码,它只是在没有运行应用程序的情况下终止。这是我得到的日志: Build/android-armeabi-debug/com.app4u.portaldorugby/PortalDo
我正在尝试根据另一个单元格的值更改单元格值(颜色“红色”或“绿色”)。我运行以下命令: df.loc[0, 'Colour'] = df.loc[0, 'Count'].apply(lambda x:
我想弄清楚如何使用 StateT结合两个 State基于对我的 Scalaz state monad examples 的评论的状态转换器回答。 看来我已经很接近了,但是在尝试申请 sequence
如果我已经为它绑定(bind)了集合,我该如何添加 RibbonLibrary 默认的快速访问项容器。当我从 UI 添加快速访问工具项时,它会抛出 Operation is not valid whi
在我学习期间Typoclassopedia我遇到了这个证明,但我不确定我的证明是否正确。问题是: One might imagine a variant of the interchange law
我是一名优秀的程序员,十分优秀!