OnClickListener()にパラメーターを渡すにはどうすればよいですか?
私のリスナーを手に入れました:
OnClickListener myListener = new OnClickListener()
{
@Override
public void onClick(View v)
{
//I want to reach params here
}
};
12個のボタンがありますが、12個のリスナーを作成したくありません。文字列を渡すだけでいいのに、まったく別のことができます。
独自のカスタムOnClickListenerを使用する
public class MyLovelyOnClickListener implements OnClickListener
{
int myLovelyVariable;
public MyLovelyOnClickListener(int myLovelyVariable) {
this.myLovelyVariable = myLovelyVariable;
}
@Override
public void onClick(View v)
{
//read your lovely variable
}
};
その問題の別の解決策、通常のメソッドを作成し、View
を追加するonClickListener
を渡すことができます] _に追加し、使用するparametersを渡します。
Button b1 = new Button();
String something = "something";
Button b2 = new Button();
String anotherSomething = "anotherSomething";
setOnClick(b1, something);
setOnClick(b2, anotherSomething);
private void setOnClick(final Button btn, final String str){
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// Do whatever you want(str can be used here)
}
});
}
クリックされたボタンに応じて文字列を処理します
public class _Test2Activity extends Activity implements OnClickListener {
private Button button1;
private Button button2;
private Button button3;
private String myString;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button1 = (Button)findViewById(R.id.button1);
button2 = (Button)findViewById(R.id.button2);
button3 = (Button)findViewById(R.id.button3);
button1.setOnClickListener(this);
button2.setOnClickListener(this);
button3.setOnClickListener(this);
myString = "This is a string";
}
@Override
public void onClick(View v) {
if(v==button1) {
//do something with myString
} else if(v==button2) {
//do something with myString
} else if (v==button3) {
//do something with myString
}
}
}
私はこれが遅い答えであることを知っていますが、うまくいけば誰かを助けることができます。私の状況では既存の答えはどれもうまくいきませんでしたが、ボタンのように振る舞う画像のsetTag機能を使用することになりました。アカウント情報は、アクティビティの開始時に設定されたグローバルメンバー変数にありました。
この場合、各行がアカウントであるテーブルを設定しています。アカウントの詳細は、画像をクリックすると表示されます(画像は単なる情報アイコンです)。
副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example:
// prior code....
// NOTE: oneAccount is an object (AccountInfo) holding information about the account
// column with the "detail" arrow
image1 = new ImageView(this);
image1.setImageResource(R.drawable.info);
image1.setLayoutParams(new TableRow.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.MATCH_PARENT));
image1.setPadding(15, 1, 15, 1);
image1.setTag(oneAccount);
// add a listener to go to that account detail on a click
image1.setOnClickListener(new TextView.OnClickListener() {
public void onClick(View v) {
// change the color to signify a click
v.setBackgroundColor(getResources().getColor(R.color.button_selected));
// get what we need out of the tag
AccountInfo thisAcct = (AccountInfo) v.getTag();
// your code would do other stuff here
}
});
// add the image to the table row
tr1.addView(image1);
これはKotlinで行う方法とJavaで行う方法とは少し異なることに注意してください。 Kotlinでは、NameOfParentClass()
をサブクラス宣言に追加します。
次に、ActivityのonCreate()
メソッドをオーバーライドします。これは次のようになります。
class MainActivity : AppCompatActivity() {
private var btnClick: Button? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnClick = findViewById(R.id.btnClick) as Button
btnClick!!.setOnClickListener { startActivity(Intent(this@MainActivity, KotlinActivity::class.Java)) }
}
}
ビューに静的コンテンツが関連付けられている場合は、HashMap
を使用してビューIDをコンテンツにマップすることもできます。
private static Map<Integer, String> idToStringMap = new HashMap<Integer, String>();
onCreate
でマップを初期化します。
idToStringMap.put(R.id.button1, "hello");
idToStringMap.put(R.id.button2, "world");
// ...
次に、onClick
のビューIDから値を取得します。
public void onClick(View v) {
String myString = idToStringMap.get(v.getId());
}
これは、スイッチケースの長いセットを使用するよりも少し簡潔です。
以下のコードのようにOnClickListenerを実装します
public class Test extends Activity implements OnClickListener{
Button btn1;
Button btn2;
Button btn3;
Button btn4;
Button btn5;
@Override
protected void onCreate(Bundle savedInstanceState) {
//initialize btn...~~~
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);
btn4.setOnClickListener(this);
btn5.setOnClickListener(this);
}
@Override
public void onClick(View view) {
switch(view.getId()) {
case will be determine by Button's Id (R.id.blablabla)
}
}