2012-05-16 8 views
50

どのようにパラメータをOnClickListener()に渡すことができますか?どのようにOnClickListenerにパラメータを渡すのですか?

は私のリスナーを手に入れた:私は12個のボタンを持って、私は彼らのために12人のリスナーを書きたいいけない

OnClickListener myListener = new OnClickListener() 
    { 

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

    } 

    }; 

、それだけで彼らに文字列を渡すために、彼らはcompletly異なることを行うことができます素晴らしいことです。

答えて

135

public class MyLovelyOnClickListener implements OnClickListener 
    { 

    int myLovelyVariable; 
    public MyLovelyOnClickListener(int myLovelyVariable) { 
      this.myLovelyVariable = myLovelyVariable; 
    } 

    @Override 
    public void onClick(View v) 
    { 
     //read your lovely variable 
    } 

    }; 
+0

私のクラスがすでに拡張されている場合は使用しますか? – Skynet

+0

メンバ変数を使用し、それに値を代入してonClick内でアクセスするよりも、この方法に利点がありますか?もしあれば何? –

+0

これは質問に答えるものですが、Listenerが完全なクラスではなくメソッドとして設計されている必要があることも明らかです。カスタムのargs(例:View v)で匿名メソッドを渡すほうがずっと簡単です –

0

使用は、コード

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) 
     } 
} 
7
  1. 以下のようにOnClickListenerを実装OnClickListenerあなたの活動がView.OnClickListener
  2. がリスナー
  3. にあなたのボタンを登録して実装持って、独自のカスタムを使用しますどのボタンがオンクリックされているか確認してください。
  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 
         } 
        } 
    } 
    
-1

がクリックされた別の解決策は、のonClick()メソッドの内部で直接コードを記述しないようにすることができ、あるいは、別の方法でコードを書いたボタンに応じた処理あなたの文字列を、及びそのメソッドをonClick()で呼び出します。

例:

button.setOnClickListener(new OnClickListener() { 
    public void onClick(View v) { 
    function(); 
    } 
}); 

private void function() { 
//your code here 
} 
+1

しかし、質問は明らかにパラメータを渡す必要があることを明確に指定します –

+0

彼はパラメータを渡すことができません –

5

私はこれが後半の答えですが、うまくいけば、それが誰かを助けることができる知っています。既存の回答は私の状況ではうまくいきませんでしたが、ボタンのように動作していた画像のsetTag機能を使用してしまいました。アカウント情報は、アクティビティの開始時に設定されたグローバルメンバー変数内にあります。

この場合、各行がアカウントであるテーブルを設定しています。アカウントの詳細は、画像がクリックされると表示されます(画像は単なる情報アイコンです)。
このように:その問題について

// 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); 
+0

クールな安定したアプローチ:)は、データバインディングでスムーズに使用することができます。 thnx –

12

別の解決策、あなたが定期的にメソッドを作成し、それをあなたがそれにonClickListenerを追加したいViewを渡し、使用したいパラメータを渡すことができますそれに伴い:

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) 

      } 
    }); 
} 
0

ビューに関連付けられた静的なコンテンツを持っている場合は、別のオプションは、コンテンツへのビューIDをマップするためにHashMapを使用することです。

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

Kotlinでこれを行うのは、Javaでのやり方とは少し異なります。 Kotlinでは、サブクラス宣言にNameOfParentClass()を追加します。

アクティビティの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([email protected], KotlinActivity::class.java)) } 
     } 
    } 
関連する問題