Android 在片段上实现onClick:在片段或活动上设置on-click侦听器

Android 在片段上实现onClick:在片段或活动上设置on-click侦听器,android,android-fragments,Android,Android Fragments,我正在使用Android,似乎有两种方法可以实现用户点击的监听器 选项1: 当触发器是片段的XML格式并且它设置了onClick属性时。 例如,这里是片段视图的一部分 <Button android:id="@+id/userClickButton" android:layout_height="wrap_content" android:layout_width="wrap_content" android:onClick="myOnClickListen

我正在使用Android,似乎有两种方法可以实现用户点击的监听器

选项1: 当触发器是片段的XML格式并且它设置了onClick属性时。 例如,这里是片段视图的一部分

<Button
    android:id="@+id/userClickButton"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:onClick="myOnClickListener"
    android:text="Click on Me"
/>
优点:

  • 所有片段的唯一OnClickListener
  • 所有变量都可以集中在活动中
缺点:

  • 当有许多与同一活动相关的片段时,可能会出现一些混淆
  • 单击的侦听器必须是公共的
选项2 当xml文件中没有onClick属性,而是在片段代码中

<Button
    android:id="@+id/userClickButton"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="Click on Me"
/>
优点:

  • 每个片段都有自己的代码
缺点:

  • 每个片段必须有自己的onClickListener
  • 片段之间的通信必须要求活动实现接口
你认为哪一个更好? (请提供你的答案和论据)

视情况而定

有时,最好在XML中使用“OnClick”属性,并在Activty中实现它

其他时候,最好在片段中实现java侦听器。这取决于按钮的动作

如果此按钮操作仅影响片段的视图(例如:显示或隐藏另一个片段的视图或类似内容),则最好使用java listener,但如果此按钮影响主活动的流程(例如:执行登录、转到下一个活动…等),则最好在XML中实现OnClick属性

安卓的医生不喜欢这样或那样。。。

您的
OnClickListener
应该位于视图所在的片段中。碎片基本上应该是自治的单位。该活动的作用只是促进片段之间的通信

例如,如果您后来决定您的片段需要托管在另一个活动中,那么您将需要重新实现之前活动中的所有代码。然而,如果将片段视为自治的,则可以轻松地将其托管在任意多个活动中

我认为对您来说,重要的设计问题是,为什么您的活动甚至需要了解正在单击的片段中的按钮。这通常是不必要的

<Button
    android:id="@+id/userClickButton"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:text="Click on Me"
/>
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
    View root = inflater.inflate(R.layout.fragment_view, null);
    Button userClickButton = (Button)root.findViewById(R.id.userClickButton);
    userClickButton.setOnClickListener(new View.onClickListener() {
        @Override
        public void onClick(View view) {
            // Something to do
        }
    });
}