我的片段在ViewPager
内,我希望其中一个片段具有可点击的RelativeLayout
。我正在使用数据绑定:
<data>
<variable
name="handlers"
type="com.matip.presenters.MyPresenter" />
</data>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> handlers.onLayoutClick()}">
...
...
...
</RelativeLayout>
My Fragments onCreateView:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mBind = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
presenter = new MyPresenter();
mBind.includedLayout.setHandlers(presenter);
return mBind.getRoot();
}
但onLayoutClick
未被调用。它与ViewPager有关吗?是否需要点击而不是里面的片段?如果是这样,我该如何解决?
修改
My ViewPager Adapter:
private class MyViewPagerAdapter extends FragmentStatePagerAdapter {
public MyViewPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
switch(position) {
case 0:
return MainInfoFragment.newInstance(parkingId);
case 1:
return MainDescFragment.newInstance(parkingId);
case 2:
return MainServicesFragment.newInstance(parkingId);
default:
return null;
}
}
@Override
public int getCount(){
return 3;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
switch(position){
case 0: return getContext().getString(R.string.info_title);
case 1: return getContext().getString(R.string.desc_title);
case 2: return getContext().getString(R.service_title);
default: return null;
}
}
}
答案 0 :(得分:2)
要在XML中获取onClick
属性,该方法需要处于活动状态。对于片段,首选方法是以编程方式设置侦听器。如果方法在活动中,XML方法将起作用,但如果方法需要对不同的片段采取不同的行为,它将变得复杂。
我也不明白你的意思android:onClick="@{() -> handlers.onLayoutClick()}"
。通常它看起来像android:onClick="onLayoutClick"
。而定义就像
public void onLayoutClick(View view) {
//Your code
}
还有一种可能性:您可能已将OnTouchListener设置为覆盖单击的视图。如果您同时需要触摸和点击侦听器,请尝试GestureDetector。
答案 1 :(得分:1)
您可以在oncreateview()方法
上执行以下操作<RelativeLayout
android:id="@+id/rl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
...
...
...
</RelativeLayout>
并将布局更改为此
<div class="container">
<div class="wrap">
<div class="slider">
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
<div class="item"></div>
</div>
</div>
</div>
如果编译器显示错误
,请在clicklistener上按alt + Enter答案 2 :(得分:0)
你是如何从Binding类中获得 includedLayout 方法的?
我无法在任何地方找到它,这是我得到的错误,
相反,你应该使用mBind.setHandlers(presenter);
起初我遇到了 Binding.setHandler 方法的错误,但是在构建或运行之后,它得到了解决并按预期工作。
和
您的MyPresenter类应具有确切的方法签名。
对于 handlers.onLayoutClick(),它应该是:
public void onLayoutClick(){
....}
ViewPager没有任何问题,我和你的完全一样 还要检查代码中的 mBind 的类型,我猜它应该是 FragmentLayoutBinding 。
片段:
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
FragmentLayoutBinding mBind = DataBindingUtil.inflate(inflater, R.layout.fragment_layout, container, false);
MyPresenter presenter = new MyPresenter();
mBind.setHandlers(presenter);
return mBind.getRoot();
}
MyPresenter:
public class MyPresenter{
//using listener binding
public void onLayoutClick(){
//do something..
}
//using method reference
public void onButtonClicked(View view){
// do something
}
}
fragment_layout:
<layout...>
<data>
<variable
name="handlers"
type="com.matip.presenters.MyPresenter" />
</data>
<RelativeLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:onClick="@{() -> handlers.onLayoutClick()}">
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="32dp"
android:text="Using Method Ref"
android:onClick="@{handlers::onButtonClicked}"/>
</RelativeLayout>
</layout>
答案 3 :(得分:0)
尝试使用方法参考而不是侦听器绑定表示法, xml 将如下所示:
android:onClick="@{handlers::onLayoutClick}
您的演示者将如下所示:
public class MyHandlers {
public void onLayoutClick(View view) { ... }
}
/!\请注意,方法的签名应接受视图作为参数并返回void并公开
编辑:您还可以通过添加以下内容确保relativeLayout的所有子节点都没有获得点击而不是他:
android:descendantFocusability="beforeDescendants"