0

私はJava(Pythonから来た)が初めてで、このコードを変換するためにメソッドをパラメーターとして渡そうとしています:

Button button1;
Button button2;
...
Button buttonN;

button1 = (Button) findViewById(R.id.button1);
button1.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onClick_button1(v);
    }
});

button2 = (Button) findViewById(R.id.button2);
button2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        onClick_button2(v);
    }
});

(...)

buttonN = (...)

次のようなものに:

public AssignListener( integer tButton, Method tMethod )
{
  button_view = (Button) findViewById(tButton);

  button_view.setOnClickListener( new View.OnClickListener() {
      @Override
      public void onClick(View view) {
          tMethod(view);
      }
  }
}

(...)

AssignListener( R.id.button1, onClick_button1 );
AssignListener( R.id.button2, onClick_button2 );
(...)
AssignListener( R.id.buttonN, onClick_buttonN );

メソッドを関数に渡すことはできないと読んだことがあります。これを実現するために Runnable を使用して関数をラップするためのアドバイスがあります。

私はそれを行う方法について明確な考えがありません。簡単に行う方法について何か考えはありますか?:?

ありがとう。

編集:「AssignListener」を独自のクラスにラップして、クラス自体を渡す必要がありますか? :?

4

5 に答える 5

2

findViewById() と seOnClickListener を onCreate メソッドに呼び出し、OnClickListenet を onCreate の外で呼び出すことができます。

Button button1 = (Button)findViewById(R.id.button1);

or

findViewById(R.id.button1).seOnClickListener(mClickListener);
findViewById(R.id.button2).seOnClickListener(mClickListener);
findViewById(R.id.button3).seOnClickListener(mClickListener);
findViewById(R.id.button4).seOnClickListener(mClickListener);

private OnClickListener mClickListener = new View.OnClickListener(
    public void onClick(View view){
        switch(view.getId()){
            case R.id.button1:
            //button1 click handle here...
            break;
            case R.id.button2:
            //button2 click handle here...
            break;
            case R.id.button3:
            //button3 click handle here...
            break;
            case R.id.button4:
            //button4 click handle here...
            break;
        }
    });

試してみてください。お役に立てば幸いです。

于 2013-03-22T08:37:56.543 に答える
1

次のように onClickListener を定義して渡すことができます。

public AssignListener( integer tButton, OnClickListener listener ){

tButton.setOnClickListener(listener);
}
于 2013-03-22T08:33:38.660 に答える
0

簡単な解決策は、ボタン ID を受け取る tMethod という関数を作成し、特定のボタン ID に対して特定のアクションを実行できるようにする switch ステートメントを作成することです。これは、tMethod(view.getId()) のように onClick 関数内で呼び出されます。

ところで、Python にはメソッドがあります。Javaには機能があります。ペダントモードがオフになりました!

于 2013-03-22T08:31:34.900 に答える
0
public class MyClass implements OnClickListener, OnLongClickListener {
    Button button1;
    Button button2;
    ...
    Button buttonN;

    . . . 
    setButtonsListener(findViewById(<your top view id>));
    . . .

    void setButtonsListener(ViewGroup vg) {
            int count = vg.getChildCount();
            Button btn;
            View v;
            for(int i=0; i < count ; i++) {
                v = vg.getChildAt(i);
                if( v instanceof Button ) {
                    btn = (Button)v; 
                    btn.setOnClickListener(this);
                    btn.setOnLongClickListener(this);
                } else if( v instanceof ViewGroup ) {
                    setButtonsListener((ViewGroup) v);
                }
            }
    }

    @Override
    public boolean onLongClick(View v) {
            // TODO Auto-generated method stub
            return false;
    }

    @Override
    public void onClick(View v) {
            // TODO Auto-generated method stub

    }
于 2013-05-20T13:01:10.943 に答える
0

最も簡単な方法は、最初のスニペットに書かれているように、ボタンごとにリスナーの実装を作成することです。

AssignListener() のようなユニバーサル メソッドを使用する合理的な利点は見当たりません。自転車を再発明しないでください。既存の setOnClickListener() メソッドを使用し、ボタンに固有のリスナーを渡します。

于 2013-03-22T08:31:13.467 に答える