有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

XML

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

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

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

Java

@Override
public void btnClick_DoSomething(View v) {

}

错误

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

Annontations are not allowed here

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


共 (5) 个答案

  1. # 1 楼答案

    这里有一些误解。要覆盖单击事件,您的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;
                 }
             }
    
  2. # 2 楼答案

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

    public void btnClick_DoSomething(View v) {
    
    
    }
    

    在运行时,您将在该方法中得到一个回调

  3. # 3 楼答案

    您可以使用片段实现视图,而不是在xml布局文件中声明onClick方法。onClickListener接口,重写onClick(),并将所有3个按钮设置为如下btn.setOnClickListener(this)。将所有3个按钮所需的行为放入onClick()。所有3个按钮都有相同的行为(除非您在onClick()中检查事件来自哪个按钮)

  4. # 4 楼答案

    你想用什么方法来替代?有任何父类有方法btnClick_DoSomething?从布局XML设置单击侦听器时,不需要覆盖任何内容。只需确保将使用此布局的activity类中存在一个名称相同、返回类型为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;
        }
    }
    
  5. # 5 楼答案

    您不需要使用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);
    
    }