web-dev-qa-db-ja.com

パラメータをOnClickListenerに渡す方法は?

OnClickListener()にパラメーターを渡すにはどうすればよいですか?

私のリスナーを手に入れました:

   OnClickListener myListener = new OnClickListener()
   {

     @Override
     public void onClick(View v)
     {
         //I want to reach params here

     }

  };

12個のボタンがありますが、12個のリスナーを作成したくありません。文字列を渡すだけでいいのに、まったく別のことができます。

57
Adam Varhegyi

独自のカスタム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
     }

  };
152
Sherif elKhatib

その問題の別の解決策、通常のメソッドを作成し、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)

           }
    });
}
21
Muhammed Refaat
  1. アクティビティにView.OnClickListenerを実装させます
  2. リスナーにボタンを登録します
  3. OnClickでクリックされたボタンを確認する
  4. クリックされたボタンに応じて文字列を処理します

    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
           }
       }
    }
    
7
Mark Pazon

私はこれが遅い答えであることを知っていますが、うまくいけば誰かを助けることができます。私の状況では既存の答えはどれもうまくいきませんでしたが、ボタンのように振る舞う画像の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);
7
Gravitoid

これは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)) }
        }
    }
0
Shraddha Patel

ビューに静的コンテンツが関連付けられている場合は、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());
}

これは、スイッチケースの長いセットを使用するよりも少し簡潔です。

0
Suragch

以下のコードのように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)
        }
}
0
Joonsung Kim