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

Android: click event after Activity.onPause()

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

当我点击按钮 B 并在按钮 A 之后立即启动时,新的 activity 启动,旧 activity 的 onPause() 生命周期事件被触发,而且第二个按钮的 onClick 事件也被触发,但在 Activity.onPause() 之后导致我的应用程序出现一些状态不一致。

有什么方法可以防止在不使用 isPaused 标志的情况下在 onPause() 之后传递 touch/click 事件?

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

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的OnClickListener中,禁用按钮b。

Button.setEnabled(false);

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

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

我能想到的一个简单的解决方案是在 Activity A 中全局维护一个标志并立即在按钮 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;
    }
}

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