有两个按钮,按钮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。
答案 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层。