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