我在ViewPager
有我的片段,我希望其中一个片段具有可点击的RelativeLayout
。 我正在使用数据绑定:
handlers.onLayoutClick()}"> ... ... ...
我的碎片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; } } }
要使XML中的onClick
属性有效,该方法需要处于活动状态。 对于片段,首选方法是以编程方式设置监听器。 如果方法在活动中,XML方法将起作用,但如果方法需要对不同的片段表现不同,则它将变得复杂。
另外我不明白你的意思是android:onClick="@{() -> handlers.onLayoutClick()}"
。 通常它看起来像android:onClick="onLayoutClick"
。 而定义就像
public void onLayoutClick(View view) { //Your code }
还有一种可能性:您可能已将OnTouchListener设置为覆盖单击的视图。 如果您同时需要触摸和单击侦听器,请尝试使用GestureDetector 。
您可以在oncreateview()方法上执行以下操作
oncreate(....) {..... View v = inflater.inflate(R.layout.fragment_layout,container,false); RelativeLayout l = v.findViewById(R.id.rl); l.setOnClickListener(this); .....} @Override public void onClick(View v) { if(v.getId == R.id.rl) { //do your work } }
并将布局更改为此
... ... ...
如果编译器显示错误,请在clicklistener上按alt + Enter
尝试使用方法引用而不是侦听器绑定表示法,您的xml将如下所示:
android:onClick="@{handlers::onLayoutClick}
而您的演示者将如下所示:
public class MyHandlers { public void onLayoutClick(View view) { ... } }
/!\请注意,方法的签名应接受视图作为参数并返回void并公开
编辑 :您还可以通过添加以下内容确保relativeLayout的所有子节点都没有获得点击而不是他:
android:descendantFocusability="beforeDescendants"
你是怎么从Binding类中获得includeLayout方法的?
我无法在任何地方find它,这是我得到的错误,而你应该只使用mBind.setHandlers(presenter);
起初我遇到了Binding.setHandler方法的错误,但在构建或运行之后,它得到了解决并按预期工作。
和
您的MyPresenter类应该具有确切的方法签名。 for handlers.onLayoutClick()应该是:
public void onLayoutClick(){ ....}
ViewPager没有任何问题,我和你的完全一样。
还要检查mBind的Type,从你的代码中我猜它应该是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: