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

时间:2018-05-21 14:33:00

标签: android android-viewpager

我的片段在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;
            }
        }
    }

4 个答案:

答案 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"