【问题标题】:Click event for multiple buttons in fragment not working片段中多个按钮的单击事件不起作用
【发布时间】:2017-10-05 02:07:31
【问题描述】:

在尝试让我的所有 3 个按钮在片段中使用相同的点击事件后,public class FragmentShapesDemo extends android.support.v4.app.Fragment implements View.OnClickListener 变为红色下划线并返回错误:

类“FragmentShapesDemo”必须声明为抽象或在 OnClickListener 中实现抽象方法“onClick(View)”

我不明白为什么在实现点击事件时会出现此错误:-/

fragment_shapes_demo.xml

<Button
    android:id="@+id/btn_1"
    android:onClick="btn_Click"
    android:text="@string/circles"/>

<Button
    android:id="@+id/btn_2"
    android:onClick="btn_Click"
    android:text="@string/squares"/>

<Button
    android:id="@+id/btn_3"
    android:onClick="btn_Click"
    android:text="@string/triangles"/>

FragmentShapesDemo.java

public class FragmentShapesDemo extends android.support.v4.app.Fragment {

    Button button0;
    Button button1;
    Button button2;

    public FragmentShapesDemo() {
        // Required empty constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_shapes_demo, container, false);

        button0 = (Button) v.findViewById(R.id.btn_1);
        button1 = (Button) v.findViewById(R.id.btn_2);
        button2 = (Button) v.findViewById(R.id.btn_3);

        button0.setOnClickListener(this);
        button1.setOnClickListener(this);
        button2.setOnClickListener(this);

        return v;
    }

    public void btn_Click(View v) {
        Toast.makeText(getActivity(), "Hello World", Toast.LENGTH_LONG).show();    
    }
}

【问题讨论】:

  • 为什么你在膨胀不同的视图时使用 getActivity().findViewById() 在你的情况下

标签: java android xml android-fragments android-button


【解决方案1】:

从 XML 中删除 onClick

<Button
    android:id="@+id/btn_1"

    android:text="@string/circles"/>

<Button
    android:id="@+id/btn_2"
    android:text="@string/squares"/>

<Button
    android:id="@+id/btn_3"
    android:text="@string/triangles"/>

使用您的 rootView 参考来查找元素视图。您也可以使用以下代码实现按钮onClick

public class FragmentShapesDemo extends android.support.v4.app.Fragment {

    Button button0;
    Button button1;
    Button button2;

    public FragmentShapesDemo() {
        // Required empty constructor
    }

    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View v = inflater.inflate(R.layout.fragment_shapes_demo, container, false);

        button0 = (Button)v.findViewById(R.id.btn_1);
        button1 = (Button)v.findViewById(R.id.btn_2);
        button2 = (Button)v.findViewById(R.id.btn_3);

        button0.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {
                    Toast.makeText(getActivity, "Do Your Work", Toast.LENGTH_SHORT).show();
                }
            });

        button1.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                }
            });

        button2.setOnClickListener(new OnClickListener() {
                public void onClick(View v) {

                }
            });

        return v;
    }
}

【讨论】:

  • 我想为我的所有按钮使用相同的点击事件,因此这个答案效率不高。如何在不输入 3 次代码的情况下做到这一点?
  • 我们需要遵循一些代码结构,因为您想从所有按钮中实现它,如何定义单击哪个按钮,您也可以选择第一个答案。但据我所知,如果没有适当的 id 初始化,就不可能获得这种能力。
  • 是否可以将所有 3 个点击事件合并为一个?例如。 button0|button1|button2.setOnClickListener
  • 不,因为 android 架构用它们唯一的 id 识别每个视图并对这些视图执行操作。否则检查黄油刀文档,它可能会有所帮助 - dzone.com/articles/butter-knife-view-injection
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多