【问题标题】:One OnClick handler for multiple buttons in a fragment片段中多个按钮的一个 OnClick 处理程序
【发布时间】:2017-09-14 21:25:42
【问题描述】:

我在一个片段中有 3 个按钮,我想使用相同的点击事件。如何在片段中实现这一点?

XML

<Button
    android:id="@+id/btn_1"
    android:onClick="btnClick_DoSomething"
    android:text="@string/one"/>

<Button
    android:id="@+id/btn_2"
    android:onClick="btnClick_DoSomething"
    android:text="@string/two"/>

<Button
    android:id="@+id/btn_3"
    android:onClick="btnClick_DoSomething"
    android:text="@string/three"/>

Java

@Override
public void btnClick_DoSomething(View v) {

}

错误

@Override(在片段 Java 类中)变为红色下划线并返回以下错误

这里不允许注释

我希望所有 3 个按钮的 onClick 事件都相同

【问题讨论】:

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


    【解决方案1】:

    您不需要编写@Override 注释,因为您没有覆盖该方法。只需使用

    public void btnClick_DoSomething(View v) {
    
    
    }
    

    你会在运行时在这个方法中得到一个回调。

    【讨论】:

    • 我希望所有 3 个按钮的 onClick 事件都相同
    • 编辑了我的答案。这样您就可以为所有 3 个按钮处理相同的 onClick 事件
    • 这需要去哪里? onCreateView / onActivityCreated / 其他地方?
    • 这是一个单独的方法。就写在onCreateView()下面吧
    【解决方案2】:

    您根本不使用 XML,而是使用 Java:

    <Button
        android:id="@+id/btn_1"
        android:text="@string/one"/>
    
    <Button
        android:id="@+id/btn_2"
        android:text="@string/two"/>
    
    <Button
        android:id="@+id/btn_3"
        android:text="@string/three"/>
    

    那么……

    private final OnClickListener onClick = new OnClickListener(){
       @Override
       public void onClick(View view){
           switch(view.getId()){
               ... cases...
           }
       }
    
    
        somewhere initialising the views you do:
        fragmentView.findViewById(R.id.btn_1).setOnClickListener(onClick);
        fragmentView.findViewById(R.id.btn_2).setOnClickListener(onClick);
        fragmentView.findViewById(R.id.btn_3).setOnClickListener(onClick);
    
    }
    

    【讨论】:

    • 我希望所有 3 个按钮的 onClick 事件都相同
    • 确实如此。只需移除“开关”
    【解决方案3】:

    您要覆盖什么方法?是否有任何父类有方法btnClick_DoSomething?从 Layout XML 设置单击侦听器时,您不需要覆盖任何内容。只需确保将使用此布局的活动类中存在一个具有 void 返回类型和一个 View 作为其唯一参数的同名方法

    在同一个 onClick 处理程序中区分来自不同 View 的点击的一般方法是通过 id 来识别它们

    public void btnClick_DoSomething(View v){
        switch(v.getId()){
             case R.id.btn_1:
                   // handle click from button 1
                   break;
             case R.id.btn_2:
                   // handle click from button 2
                   break;
             case R.id.btn_3:
                   // handle click from button 3
                   break;
        }
    }
    

    【讨论】:

    • 我希望所有 3 个按钮的 onClick 事件都相同
    • @MacaronLover 我的答案就是这样设置的。单击三个按钮中的任何一个都将调用 btnClick_DoSomething(...) 函数。无论按下哪个按钮,您是否都希望执行完全相同的操作?在这种情况下,您可以完全删除 switch 语句,然后在 btnClick_DoSomething 函数中执行您需要的任何操作。
    【解决方案4】:

    这里有一些误解。要覆盖 Click 事件,您的 Fragment 需要像这样实现 View.OnClickListener 接口:

    public class YourFragment extends Fragment implements View.OnClickListener{
    
      @Override
      public void onClick(View v) {
    
      }
    }
    

    请注意,方法的名称必须是onCLick,必须返回void 并接收View 作为要从接口覆盖的参数。在这种情况下,您需要为片段中的每个按钮设置一个侦听器:

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

    在此方法中,您可以通过 ID 控制点击了哪个对象

     @Override
          public void onClick(View v) {
            int id = v.getId();
           switch(v.getId()){
             case R.id.btn_1:
                   // handle click from button 1
                   break;
             case R.id.btn_2:
                   // handle click from button 2
                   break;
             case R.id.btn_3:
                   // handle click from button 3
                   break;
             }
          }
    

    或者,您不需要重写该方法,因此删除可以正常工作的注释:

       public void btnClick_DoSomething(View v) {
                switch(v.getId()){
                 case R.id.btn_1:
                       // handle click from button 1
                       break;
                 case R.id.btn_2:
                       // handle click from button 2
                       break;
                 case R.id.btn_3:
                       // handle click from button 3
                       break;
                 }
             }
    

    【讨论】:

    • 我希望所有 3 个按钮的 onClick 事件都相同
    • 所以,做一个回滚
    【解决方案5】:

    除了在 xml 布局文件中声明 onClick 方法,您可以让 Fragment 实现 View.onClickListener 接口,覆盖 onClick(),并像 btn.setOnClickListener(this) 那样设置所有 3 个 onClickListener 按钮。将您想要的所有 3 个按钮的行为放在 onClick() 中。所有 3 将具有相同的行为(除非您检查事件来自 onClick() 中的哪个按钮)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-04
      • 1970-01-01
      • 1970-01-01
      • 2017-10-29
      相关资源
      最近更新 更多