【问题标题】:Is it possible to click on two buttons at the same time, if one covers the other one?如果一个按钮覆盖另一个按钮,是否可以同时单击两个按钮?
【发布时间】:2026-01-17 22:20:06
【问题描述】:

抱歉这个奇怪的问题,但是如果一个完全覆盖另一个按钮,是否可以在 android 中同时单击两个按钮(有两个日志,“单击 b1”和“单击 b2”)?

【问题讨论】:

    标签: android button click


    【解决方案1】:

    通常是不可能的;顶部按钮将吸收按钮单击事件,而不是将其传递给它后面的按钮。目前尚不清楚您是否想要获得此行为或避免它,但是,您可以通过在点击侦听器中手动传播事件来强制它。

    这是一种方法(有几种);假设 buttonOne 在 buttonTwo 之上:

    final Button buttonOne = (Button) findViewById(...);
    final Button buttonTwo = (Button) findViewById(...);
    
    buttonOne.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
           Log.d("ButtonTest", "ButtonOne clicked");
           buttonTwo.performClick();
        }
    });
    
    buttonTwo.setOnClickListener(new OnClickListener() {
        @Override
        public void onClick(View v) {
           Log.d("ButtonTest", "ButtonTwo clicked");
        }
    });
    

    点击事件在按钮一上进入监听器,然后在按钮二上引发点击事件。

    这是另一种可行的方式(可以更改为轻松支持长点击事件):

    final Button buttonOne = (Button) findViewById(...);
    final Button buttonTwo = (Button) findViewById(...);
    
    final OnClickListener listenerTwo = new OnClickListener() {
        @Override
        public void onClick(View v) {
           Log.d("ButtonTest", "ButtonTwo clicked");
        }
    };
    
    final OnClickListener listenerOne = new OnClickListener() {
        @Override
        public void onClick(View v) {
           Log.d("ButtonTest", "ButtonOne clicked");
           listenerTwo.onClick(buttonTwo);
        }
    };
    
    buttonOne.setOnClickListener(listenerOne);
    buttonTwo.setOnClickListener(listenerTwo);
    

    【讨论】:

    • 我想知道这种行为。你能告诉我一个代码我如何强制它吗?正如你所说,如果我在两个按钮上都进行点击事件,那么顶部的按钮将吸收点击事件。
    • 如果我想要按钮二上的 onLingClickEvent 怎么办?所以如果我的点击很短,那么buttonone的事件就完成了,如果我的点击很长,那么buttontwo的事件就完成了?是否有 perfromLongClick 或类似的?我仍然想要两个按钮,所以制作一个 setonclicklistener 和一个 setonLongclicklistener 对我来说并不好。
    • 您可以命名监听器,然后在正确的时间直接引用它们(见答案)。 performClick() 与 listener.onClick(View) 的作用相同;这同样适用于长点击事件监听器。
    【解决方案2】:

    是的,这是可能的。您需要将前景视图上发生的单击事件传递给背景视图。您可以通过检查单击发生的位置以及它是否发生在视图的边界内来做到这一点。

    【讨论】:

    • 我不确定我该怎么做。你能告诉我一个你可以检查 clck 发生位置的代码吗?
    • 你提到前台按钮完全覆盖了后台按钮,这意味着每当点击前台按钮时,也应该触发后台按钮的点击事件,所以你甚至需要做任何边界检查吗? (如果是这种情况,您可能需要考虑重新考虑您的设计)
    最近更新 更多