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你使用的每个按钮添加一个.这很难维持.
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)
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- case比if- 更容易维护else,并且此实现不需要创建许多类变量.
Sur*_*gch 15
连接事件的五种方法监听器是一篇很棒的文章,概述了设置单个事件监听器的各种方法.让我在这里为多个听众扩展.
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)
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)
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)
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)
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)
最好的方法是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)
| 归档时间: |
|
| 查看次数: |
301348 次 |
| 最近记录: |