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

问题描述:

我有一个片段中的3个按钮,我想使用相同的单击事件。这怎么能在一个片段中实现呢?一个片段中的多个按钮的OnClick处理程序

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类内)在红色变成下划线并返回以下错误

Annontations该处不允许

我想onClick事件是相同的所有3个按钮

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

在同一个onClick处理程序中区分来自不同视图的点击的一般方法是通过编号来标识它们

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; 
    } 
} 
+0

我想让onClick事件对所有3个按钮都是一样的 – MacaronLover

+0

@MacaronLover这就是我的答案设置。点击三个按钮中的任何一个都会调用btnClick_DoSomething(...)函数。无论按下什么按钮,您是否都想要执行完全相同的操作?在这种情况下,您可以完全删除switch语句,只需在该btnClick_DoSomething函数中执行所需的任何操作即可。 – Stephen

由于您不重写该方法,因此不需要编写@Override注释。只需使用

public void btnClick_DoSomething(View v) { 


} 

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

+0

我想让所有3个按钮的onClick事件都相同 – MacaronLover

+0

编辑了我的答案。这样你可以处理所有3个按钮相同的onClick事件 – Passiondroid

+0

这需要去哪里? 'onCreateView' /'onActivityCreated' /别的地方? – MacaronLover

这里有一些误解。要覆盖一个Click事件,您Fragment需要实现View.OnClickListener界面是这样的:

public class YourFragment extends Fragment implements View.OnClickListener{ 

    @Override 
    public void onClick(View v) { 

    } 
} 

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

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

在此方法中,你可以控制单击了哪个对象由it's 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; 
      } 
     } 
+0

我希望onClick事件对于所有3个按钮都是相同的 – MacaronLover

+0

第一个示例在您的案例中运行良好 –

+0

为什么downvote? –

你根本就没有做它在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); 

} 
+0

我想要所有的3个按钮 – MacaronLover

+0

onClick事件是相同的,它是。只要删除“开关” – Budius

,而不用声明在XML布局文件中的onClick方法,你可以有你的片段执行View.onClickListener接口,覆盖onClick(),并设置所有3个按钮onClickListener这样btn.setOnClickListener(this)。把你想要的所有3个按钮的行为放在onClick()。所有3个都将具有相同的行为(除非您在onClick()中检查事件来自哪个按钮)。