【问题标题】:Android: click event after Activity.onPause()Android:Activity.onPause() 之后的点击事件
【发布时间】:2016-11-17 00:40:02
【问题描述】:

有两个按钮,按钮 A 在其 onClickListener 中使用简单的 Activity.startActivity() 方法启动另一个活动,按钮 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。

【问题讨论】:

  • 您能否发布一些您正在尝试做的事情的代码,以便让任何想要提供帮助的人更清楚?
  • 我只是不想在 onPause() 被触发后传递点击事件。
  • onClick 事件无法自动触发。如果您输入您的代码,那么我们可以更好地理解以找出我们的问题
  • @Sayem 它不会自动发生,我写道我点击了两个按钮
  • @VigneshKarthikeyan 我添加了重现问题的代码。

标签: android activity-lifecycle


【解决方案1】:

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

Button.setEnabled(false);

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

【讨论】:

  • 感谢您的回答,但是如果我的视图层次结构真的很复杂,我将不得不禁用许多视图。
  • @Mariusz 覆盖 Activity#dispatchTouchEvent(MotionEvent ev) 然后
【解决方案2】:

我知道这个问题已经很老了,离活跃还很远。我通过博客发现了这个问题。

我能想到的一个简单解决方案是在 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;
    }
}

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 你能提供更多细节吗?谢谢!
    猜你喜欢
    • 2015-07-26
    • 2012-05-17
    • 1970-01-01
    • 2013-05-21
    • 1970-01-01
    • 1970-01-01
    • 2011-11-12
    • 2016-09-19
    • 2020-01-09
    相关资源
    最近更新 更多