实现onClick on Fragment:在Fragment或Activity上设置on click侦听器

时间:2014-05-28 14:56:06

标签: android android-fragments

我正在使用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"
/>

在Activity

中设置方法MyOnClickListener
public void MyOnClickListener(View v) {
    switch (v.getId()) { 
        case R.id.useerClickButton:
            break;
    }
}

优点:

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

缺点:

  • 当有大量与同一活动相关的片段时,可能存在一些混淆。
  • 点击的监听者必须是公开的

选项2 当xml没有onClick的属性但是在Fragment代码中

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

Fragment中的Java代码

@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
        }
    });
}

优点:

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

缺点:

  • 每个片段必须有自己的onClickListener
  • 片段之间的通信必须要求Activity实现接口。

您认为哪一个更好? (请用论据提供答案)

2 个答案:

答案 0 :(得分:1)

你的OnClickListener应该在视图所在的片段中。碎片应该是基本上自治的单位。活动的作用是简单地促进碎片之间的沟通。

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

我认为重要的设计问题是你的Activity甚至需要知道被点击的片段中的Button。通常没有必要这样做。

答案 1 :(得分:0)

取决于。

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

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

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

Android的doc不喜欢其中一个...... http://developer.android.com/reference/android/widget/Button.html