Android:单击Activity.onPause()之后的事件

Android:单击Activity.onPause()之后的事件,android,activity-lifecycle,Android,Activity Lifecycle,有两个按钮,按钮A使用简单的activity.startActivity()方法在其onClickListener内启动另一个活动,按钮B在其onClickListener内执行其他一些工作 当我单击按钮B并紧跟在按钮A之后时,新活动开始,旧活动的onPause()生命周期事件被激发,但第二个按钮的onClick事件也被激发,但在activity.onPause()之后,这会导致我的应用程序中的某些状态不一致 是否有任何方法可以防止在onPause()之后传递触摸/点击事件而不使用isPause

有两个按钮,按钮A使用简单的activity.startActivity()方法在其onClickListener内启动另一个活动,按钮B在其onClickListener内执行其他一些工作

当我单击按钮B并紧跟在按钮A之后时,新活动开始,旧活动的onPause()生命周期事件被激发,但第二个按钮的onClick事件也被激发,但在activity.onPause()之后,这会导致我的应用程序中的某些状态不一致

是否有任何方法可以防止在onPause()之后传递触摸/点击事件而不使用isPaused标志

**编辑:**我的代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button buttonA = (Button) findViewById(R.id.activity_button);
        buttonA.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(MainActivity.this, TestActivity.class));
            }
        });

        Button buttonB = (Button) findViewById(R.id.log_button);
        buttonB.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.e("TEST", "onClick");
            }
        });
    }

    @Override
    protected void onPause() {
        super.onPause();
        Log.e("TEST", "onPause");
    }
}

基本上,如果您足够快,并在按钮A之后单击按钮B,则B的onClick将在onPause后触发。

在按钮A的onClick侦听器中,禁用按钮B

Button.setEnabled(false);

只需根据您的要求在A的onClickListener或onResume上启用按钮。

我知道这个问题已经很老了,还远没有被激活。我在博客上遇到了这个问题

我可以考虑的一个简单的解决方案是在活动A中全局维护一个标志,并在单击按钮A时立即将其设置。此标志可以在活动A的onResume中重置

此标志应在onClick处理程序的顶部使用,并且必须忽略所有视图的所有单击。当然,这需要有一个onClick方法

private boolean isOnClickIgnored= false;

@Override
public void onResume() {
    super.onResume();
    isOnClickIgnored = false;
}

@Override
public void onClick(View v) {
    super.onClick(v);
    if(isOnClickIgnored){
        return;
    }
    switch (v.getId()){
        case R.id.btnA:
            isOnClickIgnored = true;
            // Do button a things like opening Activity B
            break;
        case R.id.btnB:
            // Do button b things
            break;
        case R.id.btnZ:
            // Do button z things
            break;
    }
}

使用ViewModels+lifecycle-aware LiveData可以轻松解决整个概念,其中LiveData仅在允许的情况下向UI层公开事件。

您能否发布一些代码,说明您正在尝试执行的操作,以使任何试图提供帮助的人都能更清楚地了解这些操作?我只是不希望在onPause()之后传递单击事件无法自动触发onClick事件。如果你把你的代码,那么我们可以更好地了解,以找出我们的problem@Sayem这并不是自动发生的,我写道我会同时点击这两个按钮buttons@VigneshKarthikeyan我添加了重现问题的代码。谢谢你的回答,但是,如果我的视图层次结构非常复杂,我将不得不禁用许多视图。@Mariusz override
Activity#dispatchTouchEvent(MotionEvent ev)
那么您能提供更多详细信息吗?谢谢