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

您可以在 onCreate 方法中调用 findViewById() 和 seOnClickListener,在 onCreate 之外调用 OnClickListenet。

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
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 回答
0

一个简单的解决方案是创建一个名为 tMethod 的函数,该函数接受一个按钮 id,并具有一个 switch 语句,允许对给定的按钮 id 执行特定操作。这将在 onClick 函数中调用,如 tMethod(view.getId())。

顺便说一句,Python 有方法。Java有函数。学徒模式关闭!

于 2013-03-22T08:31:34.900 回答