【问题标题】:OnClick event isn't being triggered in fragment inside ViewPagerOnClick 事件未在 ViewPager 内的片段中触发
【发布时间】:2018-05-21 14:32:59
【问题描述】:

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

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

【问题讨论】:

  • 你的onLayoutClicked方法在哪里?,可以分享一下MyPresenter.java吗?
  • 请张贴MyPresenteronLayoutClick() 方法及其签名。另外,如果您尝试android:onClick="@{handlers::onLayoutClick}" 会怎样?
  • 您检查我的答案了吗...??因为它应该可以解决您的问题。。按您的预期工作。
  • @matip 你找到什么解决方案了吗?

标签: android android-viewpager


【解决方案1】:

要使 XML 中的 onClick 属性起作用,该方法需要处于活动状态。对于片段,首选方法是以编程方式设置侦听器。如果方法在 Activity 中,XML 方法将起作用,但如果该方法需要针对不同的片段采取不同的行为,则会变得复杂。

另外我不明白你所说的android:onClick="@{() -&gt; handlers.onLayoutClick()}" 是什么意思。通常它看起来像android:onClick="onLayoutClick"。定义会是这样的

public void onLayoutClick(View view) {
    //Your code
} 

还有另一种可能性:您可能已将 OnTouchListener 设置为覆盖单击的视图。如果你想要触摸和点击监听器,那么试试GestureDetector

【讨论】:

  • xml的onClick事件必须在Activity中声明,它使用反射的方式在Activity中查找方法。
  • 它不必处于活动状态。我正在使用数据绑定并提供我的演示者类来处理点击。但同样使用标准方法处理点击仍然行不通
【解决方案2】:

您可以在 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
     }  
}

并将布局更改为此

<RelativeLayout
android:id="@+id/rl"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
...
...
...
</RelativeLayout>

如果编译器显示错误,请在 clicklistener 上按 alt+enter

【讨论】:

  • 我以前试过这个。而且这样还是不行
【解决方案3】:

尝试使用 方法参考 而不是 listener binding 表示法,您的 xml 将是这样的:

android:onClick="@{handlers::onLayoutClick}

您的 Presenter 将如下所示:

public class MyHandlers {
public void onLayoutClick(View view) { ... }
}

/!\ 注意方法的签名应该接受一个视图作为参数并返回 void 并且是公共的

编辑 :您还可以通过添加:

android:descendantFocusability="beforeDescendants"

【讨论】:

  • 将此属性放在 xml 中的 RelativeLayout 上:android:descendantFocusability = "beforeDescendants"
  • 还是什么都没有:(
【解决方案4】:

您是如何从 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();
    }

我的演示者:

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>

【讨论】:

  • 包含的布局只是包含在片段主布局中的布局
  • 你不需要使用includedLayout方法,跳过它,只使用setHanders(presenter)..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-30
  • 2020-01-31
  • 2013-04-30
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多