ViewPager中的片段中未触发OnClick事件

我在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: