如何在 Fragment 中捕获 onclick 事件

Posted

技术标签:

【中文标题】如何在 Fragment 中捕获 onclick 事件【英文标题】:How to catch onclick event in Fragment 【发布时间】:2013-05-10 17:07:04 【问题描述】:

我在 xml 布局文件中声明了许多按钮,并将此布局用于片段。

按钮 android:id="@+id/button1" android:onClick="onClickButton"/> 按钮 android:id="@+id/button2" android:onClick="onClickButton"/> …… 按钮 android:id="@+id/buttonN" android:onClick="onClickButton"/>

令人失望的是,“onClickButton”事件被捕获在宿主活动中,而不是在我的片段中。当然,在我的片段中,我可以手动解决这个问题,如下所示:

@覆盖 public View onCreateView(LayoutInflater inflater, ViewGroup 容器, 捆绑保存的InstanceState) 查看视图 = inflater.inflate(R.layout.fragment_content, container, false); 按钮 button1 = (Button) view.findViewById(R.id.button1); button1.setOnClickListener(...); ... 等等 按钮 buttonN = (Button) view.findViewById(R.id.buttonN); buttonN.setOnClickListener(...);

是否有任何明确的方式来处理 Fragment 中的 onClickbutton 事件?

【问题讨论】:

【参考方案1】:

你提到的方法是标准的做法:

 Button buttonN = (Button) view.findViewById(R.id.buttonN);
 buttonN.setOnClickListener(...);

只要让你的 Fragment 实现 OnClickListener 然后你就可以设置它来监听所有按钮

Button buttonN = (Button) view.findViewById(R.id.buttonN);
buttonN.setOnClickListener(this);

【讨论】:

【参考方案2】:

不幸的是,在代码中这样做是仅使用 Android SDK 时的唯一方法。

你有没有尝试过一些定制的东西? AndroidAnnotations 或 RoboGuice 让它不那么冗长。

【讨论】:

我宁愿用【数据竞价官方库】(developer.android.com/topic/libraries/data-binding/index.html) @venimania 数据绑定库在 2013 年不可用。ButterKnife 也不可用。对于 Android 开发人员来说,这是一段黑暗时期;)【参考方案3】:

嗯。有趣的。我从不尝试这些代码。这只是一个理论。我在其他情况下经常使用这个 OnClickListener。

=====================

如果按钮具有不同的 id,它们可以使用相同的 OnClickListener。 这很容易。

一个 OnClickListener 可以调用另一个 OnClickListener。

像这样……

OnClickListener other;
OnClickListener demo = new OnClickListener() 
    void onClick(View v) 
        if(other != null)other.onClick(v);
    

所以,在你的 Activity 中设置一个 ArrayList。当 Fragment 创建并附加到 Activity 时,将 OnClickListener 放入其中。当 Fragment 销毁和分离时,删除您的 OnClickListener。

ArrayList<OnClickListener> list = new ArrayList<>();
OnClickListener demo = new OnClickListener() 
    void onClick(View v) 
        for(OnClickListener demo : list) 
             demo.onClick(v);
        
    
;

这个模块应该做你想做的事。也许修复一些代码。

【讨论】:

以上是关于如何在 Fragment 中捕获 onclick 事件的主要内容,如果未能解决你的问题,请参考以下文章

如何在此 onclick 函数中成功传递参数?未捕获的 ReferenceError:未定义 B081517B [重复]

RecyclerView:如何捕获 ImageView 上的 onClick?

尝试在片段中实现 OnClick 侦听器 [重复]

Xamarin.Android:如何捕获 OnClick XML 属性中定义的按钮事件?

调用onclick时Android从Fragment更改Tab

Android Fragment onClick 按钮打开具有相同活动的新 Fragment