Android OnClickListener - 识别按钮

xpe*_*int 134 events resources android listener

嘿.我有活动:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler);
    b2.setOnClickListener(myhandler);
    ...
  }
  View.OnClickListener myhandler = new View.OnClickListener() {
    public void onClick(View v) {
      // MY QUESTION STARTS HERE!!!
      // IF b1 do this
      // IF b2 do this
      // MY QUESTION ENDS HERE!!!
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如何查看单击了哪个按钮?

Cri*_*ian 197

您将以一种简单的方式学习如何做到这一点:

public class Mtest extends Activity {
  Button b1;
  Button b2;
  public void onCreate(Bundle savedInstanceState) {
    ...
    b1 = (Button) findViewById(R.id.b1);
    b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(myhandler1);
    b2.setOnClickListener(myhandler2);
    ...
  }
  View.OnClickListener myhandler1 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 1st button
    }
  };
  View.OnClickListener myhandler2 = new View.OnClickListener() {
    public void onClick(View v) {
      // it was the 2nd button
    }
  };
}
Run Code Online (Sandbox Code Playgroud)

或者,如果您只使用一个clicklistener,您可以:

View.OnClickListener myOnlyhandler = new View.OnClickListener() {
  public void onClick(View v) {
      switch(v.getId()) {
        case R.id.b1:
          // it was the first button
          break;
        case R.id.b2:
          // it was the second button
          break;
      }
  }
}
Run Code Online (Sandbox Code Playgroud)

虽然,我不建议这样做,因为你必须为if你使用的每个按钮添加一个.这很难维持.

  • 实际上不推荐两种方式,请参阅我的回答 (2认同)

Chr*_*nos 76

或者您可以尝试相同但没有听众.在您的按钮XML定义上:

android:onClick="ButtonOnClick"
Run Code Online (Sandbox Code Playgroud)

并在您的代码中定义方法ButtonOnClick:

public void ButtonOnClick(View v) {
    switch (v.getId()) {
      case R.id.button1:
        doSomething1();
        break;
      case R.id.button2:
        doSomething2();
        break;
      }
}
Run Code Online (Sandbox Code Playgroud)

  • 虽然是一种有趣的不同方法,但是对于侦听器的XML挂钩在使用`Fragment'的角落时会很粗糙,因为回调必须驻留在活动中(而不是片段). (6认同)
  • 比使用一堆事件处理程序,`if`语句和监听器的其他答案更清晰.如果在运行时创建按钮,则监听器很棒,但通常情况并非如此. (3认同)

Saa*_*ooq 42

我更喜欢:

class MTest extends Activity implements OnClickListener {
    public void onCreate(Bundle savedInstanceState) {
    ...
    Button b1 = (Button) findViewById(R.id.b1);
    Button b2 = (Button) findViewById(R.id.b2);
    b1.setOnClickListener(this);
    b2.setOnClickListener(this);
    ...
}
Run Code Online (Sandbox Code Playgroud)

然后:

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.b1:
            ....
            break;
        case R.id.b2:
            ....
            break;
    }   
}
Run Code Online (Sandbox Code Playgroud)

Switch- caseif- 更容易维护else,并且此实现不需要创建许多类变量.


Sur*_*gch 15

连接事件的五种方法监听器是一篇很棒的文章,概述了设置单个事件监听的各种方法.让我在这里为多个听众扩展.

1.会员等级

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        //attach an instance of HandleClick to the Button
        HandleClick handleClick = new HandleClick();
        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
    }    
    private class HandleClick implements OnClickListener{
        public void onClick(View view) {
            switch(view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2.接口类型

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(handleClick);
        findViewById(R.id.button2).setOnClickListener(handleClick);
    }
    private OnClickListener handleClick = new OnClickListener() {
        public void onClick(View view) {
            switch (view.getId()) {
            case R.id.button1:
                // do stuff
                break;
            case R.id.button2:
                // do stuff
                break;
            }
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

3.匿名内部阶级

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // do stuff
            }
        });
        findViewById(R.id.button2).setOnClickListener(new OnClickListener() {
            public void onClick(View view) {
                // do stuff
            }
        });
    }
}
Run Code Online (Sandbox Code Playgroud)

4.活动实施

public class main extends Activity implements OnClickListener {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        findViewById(R.id.button1).setOnClickListener(this);
        findViewById(R.id.button2).setOnClickListener(this);
    }
    public void onClick(View view) {
        switch (view.getId()) {
        case R.id.button1:
            // do stuff
            break;
        case R.id.button2:
            // do stuff
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

5. OnClick事件的视图布局中的属性

public class main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
    }
    public void HandleClick(View view) {
        switch (view.getId()) {
        case R.id.button1:
            // do stuff
            break;
        case R.id.button2:
            // do stuff
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在xml中:

<Button
    android:id="@+id/button1"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="HandleClick" />
<Button
    android:id="@+id/button2"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:onClick="HandleClick" />
Run Code Online (Sandbox Code Playgroud)


ruh*_*lde 12

另一种方法是从活动中获得一个监听器,如下所示:

public class MyActivity extends Activity implements OnClickListener {
    .......  code

    //my listener
    @Override
    public void onClick(View v) {
        if (v.getId() == R.id.mybutton) { 
            DoSomething();
            return;
        }

        if (v.getId() == R.id.mybutton2) { 
            DoSomething2();
            return;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我喜欢用单个IF而不是switch-else来做,但如果您愿意,那么您应该这样做:

//my listener
@Override
public void onClick(View v) {
    switch(v.getId()) {
        case R.id.mybutton:
        { 
             DoSomething();
             break;
        }

        case R.id.mybutton2:
        {
            DoSomething();
            break;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)


lor*_*105 12

如果您不想在类代码中保存2按钮的实例,请遵循这种更好的方式(这更清晰,更快!!):

public void buttonPress(View v) {
  switch (v.getId()) {
    case R.id.button_one:
        // do something
        break;
    case R.id.button_two:
        // do something else
        break;
    case R.id.button_three:
        // i'm lazy, do nothing
        break;
  }
}
Run Code Online (Sandbox Code Playgroud)


ogn*_*ian 9

最好的方法是switch在v.getId()之间进行操作.为每个Button分别使用匿名OnClickListener会占用更多内存.不需要将视图转换为按钮.在可以切换时使用if-else更慢且更难读取.在Android的源代码中,您经常会注意到if-else比较引用:

if (b1 == v) {
 // ...
} else if (b2 == v) {
Run Code Online (Sandbox Code Playgroud)

我不知道为什么他们选择这种方式,但它也有效.


小智 7

使用setTag();

像这样:

@Override    
public void onClick(View v) {     
    int tag = (Integer) v.getTag();     
    switch (tag) {     
    case 1:     
        System.out.println("button1 click");     
        break;     
    case 2:     
        System.out.println("button2 click");     
       break;   
    }     
}     
Run Code Online (Sandbox Code Playgroud)