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

时间:2016-07-14 07:46:44

标签: android activity-lifecycle

有两个按钮,按钮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,那么在onPause之后会触发B onClick。

3 个答案:

答案 0 :(得分:2)

在按钮A的OnClickListener中,禁用按钮b。

Button.setEnabled(false);

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

答案 1 :(得分:1)

我知道这个问题很老,离活跃很远。我通过博客遇到了这个问题。

我可以想到的一个简单解决方案是,在Activity A中全局维护一个标志,并将其立即设置在Button A的onClick中。可以在Activity 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;
    }
}

答案 2 :(得分:0)

使用ViewModels +具有生命周期意识的LiveData可以轻松解决整个概念,其中LiveData仅在允许时才将事件公开给UI层。