こんにちは。私は活動があります:
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!!!
}
}
}
どのボタンがクリックされたかを確認するにはどうすればいいですか?
あなたは簡単な方法でそれを行う方法を学ぶでしょう:
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
}
};
}
または、クリックリスナを1つだけ使用している場合は、次の操作を実行できます。
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;
}
}
}
ただし、使用するボタンごとにif
を追加する必要があるため、そのようにすることはお勧めしません。それを維持するのは難しいです。
リスナーを使わずに同じことを試すこともできます。あなたのボタンのXML定義で:
Android:onClick="ButtonOnClick"
そしてあなたのコードでメソッドButtonOnClick
を定義します。
public void ButtonOnClick(View v) {
switch (v.getId()) {
case R.id.button1:
doSomething1();
break;
case R.id.button2:
doSomething2();
break;
}
}
私は好きです:
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);
...
}
その後:
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.b1:
....
break;
case R.id.b2:
....
break;
}
}
Switch
-case
はif
-else
よりも保守が簡単で、この実装では多くのクラス変数を作成する必要はありません。
イベントリスナを接続するための5つの方法 は単一のイベントリスナを設定するためのさまざまな方法を概説している素晴らしい記事です。複数のリスナーのためにここでそれを拡張しましょう。
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;
}
}
}
}
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;
}
}
};
}
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
}
});
}
}
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;
}
}
}
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;
}
}
}
そして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" />
もう1つの方法は、アクティビティからの単一のリスナーです。
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;
}
}
}
私はswitch-elseの代わりに単一のIFでそれをしたいのですが、あなたがそれを好むのなら、あなたはそれをするべきです:
//my listener
@Override
public void onClick(View v) {
switch(v.getId()) {
case R.id.mybutton:
{
DoSomething();
break;
}
case R.id.mybutton2:
{
DoSomething();
break;
}
}
}
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;
}
}
最善の方法は、v.getId()の間にswitch
nameを指定することです。各ボタンに個別の匿名のOnClickListenerを設定すると、メモリの消費量が増えます。ボタンへのビューのキャストは不要です。切り替えが可能なときにif-elseを使用すると、遅くなり読みにくくなります。 Androidのソースでは、if-elseによる参照の比較に気付くことがよくあります。
if (b1 == v) {
// ...
} else if (b2 == v) {
なぜ彼らがこのように選んだのか正確にはわかりませんが、それでもうまくいきます。
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;
}
}
Cristian Cの答え(申し訳ありませんが、コメントを作成することはできません)に加えて、両方のボタンに対して1つのハンドラを作成する場合は、vをb1およびb2と直接比較するか、IDで比較する場合は、 vをButtonにキャストする必要はありません(ViewにもgetId()メソッドがあります)。そのため、キャスト例外の心配はありません。
Button mybutton = new Button(ViewPagerSample.this);
mybutton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
}
});
Button button1 = (Button)findViewById(R.id.button1);
button1.setOnClickListener(this);
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
if(v.getId() == R.id.button1){
Toast.makeText(context, "Button 1 Click", Toast.LENGTH_LONG).show();
}
}