Androidアプリケーションを作成しています。各クラスでこれに似たコードの繰り返しを多数作成していることに気付きました。
_Button buttonX = (Button)findViewById(R.id.buttonXName);
// Register the onClick listener with the implementation above
buttonX.setOnClickListener(new OnClickListener() {
public void onClick(View v)
{
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
_
現在15個のボタンがあり、これによりコードが見苦しくなります。誰もがこれらのすべてのコードをより効率的なものに変える方法のクラスや例を持っていますか?
{Button buttonX (Button)findViewById(R.id.buttonXName);}
を作成します{buttonX.setOnClickListener(new OnClickListener()}
{public void onClick(View v)}
誰かが何かを知っているなら、私はそれを感謝します。
1.6以降をターゲットにしている場合は、 Android:onClick xml属性 を使用して、繰り返しコードの一部を削除できます。 このブログ投稿 Romain Guyを参照してください。
<Button
Android:height="wrap_content"
Android:width="wrap_content"
Android:onClick="myClickHandler" />
そして、Javaクラスでは、以下のコード行を使用します。
class MyActivity extends Activity {
public void myClickHandler(View target) {
// Do stuff
}
}
アクティビティにOnClickListener()を実装します...
public class MyActivity extends Activity implements View.OnClickListener {
}
各ボタンの使用...
buttonX.setOnClickListener(this);
アクティビティonClick()メソッドで、どのボタンであるかをテストします...
@Override
public void onClick(View view) {
if (View.equals(buttonX))
// Do something
}
またonClickでは、view.getId()を使用してリソースIDを取得し、それをswitch/caseブロックで使用して各ボタンを識別し、関連するアクションを実行できます。
public void registerButtons(){
register(R.id.buttonName1, ()-> {/*Your code goes here*/});
register(R.id.buttonName2, ()-> {/*Your code goes here*/});
register(R.id.buttonName3, ()-> {/*Your code goes here*/});
}
private void register(int buttonResourceId, Runnable r){
findViewById(buttonResourceId).setOnClickListener(v -> r.run());
}
public void registerButtons(){
register(R.id.buttonName1);
register(R.id.buttonName2);
register(R.id.buttonName3);
}
private void register(int buttonResourceId){
findViewById(buttonResourceId).setOnClickListener(buttonClickListener);
}
private OnClickListener buttonClickListener = new OnClickListener() {
@Override
public void onClick(View v){
switch (v.getId()) {
case R.id.buttonName1:
// TODO Auto-generated method stub
break;
case R.id.buttonName2:
// TODO Auto-generated method stub
break;
case View.NO_ID:
default:
// TODO Auto-generated method stub
break;
}
}
};
setOnClickListener
はView
ではなくButton
で定義されているため、他の何かに変数が必要ない場合は、次のように少し簡潔にすることができます。
findViewById(R.id.buttonXName).setOnClickListener(new OnClickListener() {
public void onClick(View v) {
//DO SOMETHING! {RUN SOME FUNCTION ... DO CHECKS... ETC}
}
});
配列を使用して、Androidのように複数のボタンクリックリスナーを処理できます。ここでは、配列を次のように使用して、n個のボタンのボタンクリックリスナーを設定しています。
Button btn[] = new Button[n];
注:nは定数の正の整数です
コード例:
//class androidMultipleButtonActions
package a.b.c.app;
import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.widget.Button;
public class androidMultipleButtonActions extends Activity implements OnClickListener{
Button btn[] = new Button[3];
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btn[0] = (Button) findViewById(R.id.Button1);
btn[1] = (Button) findViewById(R.id.Button2);
btn[2] = (Button) findViewById(R.id.Button3);
for(int i=0; i<3; i++){
btn[i].setOnClickListener(this);
}
}
public void onClick(View v) {
if(v == findViewById(R.id.Button1)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button2)){
//do here what u wanna do.
}
else if(v == findViewById(R.id.Button3)){
//do here what u wanna do.
}
}
}
注:書き込み方法がわからない場合は、最初にmain.xmlファイルを記述してください。wesagnd@ yahoo.comにメールしてください。
通常、ループで必要なことを実行できると思います。これは、多くのonClick
メソッドよりもはるかに優れています。
同様の問題に対してループを使用する方法のデモンストレーションについては、 this answer をご覧ください。ループをどのように構築するかは、onClick
関数のニーズと、それらが互いにどの程度類似しているかによって異なります。最終的な結果は、コードの繰り返しが少なくなり、保守が容易になります。
以下のようにView.OnClickListener
でアクティビティを実装します。
public class MyActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_options);
Button button = findViewById(R.id.button);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.button:
// Write your code here first button
break;
case R.id.button2:
// Write your code here for second button
break;
}
}
}
public class MyActivity extends AppCompatActivity implements View.OnClickListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan_options);
Button button = findViewById(R.id.button);
Button button2 = findViewById(R.id.button2);
button.setOnClickListener(this);
button2.setOnClickListener(this);
}
@Override
public void onClick(View view) {
int id = view.getId();
switch (id) {
case R.id.button:
// Write your code here first button
break;
case R.id.button2:
// Write your code here for second button
break;
}
}
}
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
Button b1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
b1=(Button)findViewById(R.id.button);
b1.setOnClickListener(this);
}
@Override
public void onClick(View v) {
Toast.makeText(getApplicationContext(),"Button is Working",Toast.LENGTH_LONG).show();
}
}