你可以使用相同的 OnClickListener 来监听不同的按钮吗?

11
在Android中,我可以为不同的按钮使用相同的OnClickListener吗?如果可以,我如何获取生成点击的按钮?当前我有4个按钮,每个按钮都有自己的OnClickListener。每个OnClickListener都在执行完全相同的操作,除了获取被点击的按钮的文本。我想创建一个单一的OnClickListener,但是我无法确定哪个按钮被点击。谢谢。
protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        mTts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {

            @Override
            public void onInit(int arg0) {
                // TODO Auto-generated method stub

            }
        });
        setContentView(R.layout.home);
        Button button1 = (Button)findViewById(R.id.button1);
        Button button2 = (Button)findViewById(R.id.button2);
        Button button3 = (Button)findViewById(R.id.button3);
        Button button4 = (Button)findViewById(R.id.button4);

        //Load First Word
        button1.setOnClickListener(button1ClickListener);
        button2.setOnClickListener(button2ClickListener);
        button3.setOnClickListener(button3ClickListener);
        button4.setOnClickListener(button4ClickListener);

    }

用于监听器的代码,在粗体部分有所不同

private OnClickListener button1ClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        **Button button = (Button)findViewById(R.id.button1);**
        handleButtonClick(button);
    }
};

private OnClickListener button2ClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        **Button button = (Button)findViewById(R.id.button2);**
        handleButtonClick(button);

    }
};

private OnClickListener button3ClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        **Button button = (Button)findViewById(R.id.button3);**
        handleButtonClick(button);

    }
};

private OnClickListener button4ClickListener = new View.OnClickListener() {
    @Override
    public void onClick(View arg0) {
        **Button button = (Button)findViewById(R.id.button4);**
        handleButtonClick(button);

    }
};

处理按钮点击的代码

private void handleButtonClick(Button button) {
        if(button.getText().equals(currentWord)){
            currentScore += availableScore;
            TextView score = (TextView)findViewById(R.id.textViewScore);
            score.setText(String.valueOf(score));
            currentIndex++;
            availableScore = 4;
            InitializeGame();
        }
        else{
            availableScore--;
            button.setEnabled(false);
        }
    }

在Karthik的建议下,我修改了代码如下:

protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);

        mTts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {

            @Override
            public void onInit(int arg0) {
                // TODO Auto-generated method stub

            }
        });
        setContentView(R.layout.home);
        Button button1 = (Button)findViewById(R.id.button1);
        Button button2 = (Button)findViewById(R.id.button2);
        Button button3 = (Button)findViewById(R.id.button3);
        Button button4 = (Button)findViewById(R.id.button4);

        //Load First Word
        button1.setOnClickListener(buttonClickListener);
        button2.setOnClickListener(buttonClickListener);
        button3.setOnClickListener(buttonClickListener);
        button4.setOnClickListener(buttonClickListener);

    }

点击监听器代码

private OnClickListener buttonClickListener = new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {
            handleButtonClick((Button)arg0);
        }
    };
2个回答

9
是的,这是可能的。我写了一个相对简单的例子如下。
像往常一样,为所有按钮添加OnClickListener,如下所示:
btn1.setOnClickListener(this);
btn2.setOnClickListener(this);
btn3.setOnClickListener(this);

然后按照下面所示添加 onClick() 事件:
@Override
public void onClick(View v) {
    // TODO Auto-generated method stub
    if(v == btn1){
        //Things to do  
    }
    if(v == btn2){
        //Things to do      
    }
    if(v == btn3){
        //Things to do  
    } 
}

这应该完全没问题。不要忘记为包含onCreate的类实现View.OnClickListener,否则上面设置OnClickListener的那些语句都将不正确。


很好,我没有意识到视图实际上就是按钮本身。谢谢你。我不得不稍微修改了一下你的代码,但最终成功让它正常运行了。 - atbebtg

3
    protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);

            mTts = new TextToSpeech(this, new TextToSpeech.OnInitListener() {

                @Override
                public void onInit(int arg0) {
                    // TODO Auto-generated method stub

                }
            });
            setContentView(R.layout.home);
            Button button1 = (Button)findViewById(R.id.button1);
            Button button2 = (Button)findViewById(R.id.button2);
            Button button3 = (Button)findViewById(R.id.button3);
            Button button4 = (Button)findViewById(R.id.button4);

            //Load First Word
            button1.setOnClickListener(button1ClickListener);
            button2.setOnClickListener(button2ClickListener);
            button3.setOnClickListener(button3ClickListener);
            button4.setOnClickListener(button4ClickListener);

        }

    @Override
        public void onClick(View v)

    {

    int id = v.getId();
    switch (id) {  
    case R.id.button1:  
    //your code
    break;
 case R.id.button2:  

    break;
 case R.id.button3:  

    break;
    }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接