片段中多个按钮的一个OnClick处理程序

时间:2017-04-18 21:16:51

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

我在片段中有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"/>

爪哇

@Override
public void btnClick_DoSomething(View v) {

}

错误

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

  

这里不允许出现咒语

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

5 个答案:

答案 0 :(得分:1)

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

public void btnClick_DoSomething(View v) {


}

您将在运行时获得此方法的回调。

答案 1 :(得分:0)

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

在同一个onClick处理程序中区分不同视图的点击次数的一般方法是通过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;
    }
}

答案 2 :(得分:-1)

这里有一些误解。要覆盖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;
         }
      }

或者,您不需要覆盖该方法,因此请删除可以正常工作的anotation:

   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 :(得分:-1)

你只是不用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);

}

答案 4 :(得分:-1)

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