【问题标题】:Show Action Bar when user does not interact for some time in Android当用户在 Android 中一段时间​​没有交互时显示操作栏
【发布时间】:2013-10-25 21:48:50
【问题描述】:

嗨,在我的 android 应用程序中,我想在用户交互时隐藏操作栏,并在用户停止交互一段时间后再次显示它。现在我已经有了隐藏操作栏的代码:

    mViewPager.setOnTouchListener(new OnTouchListener() {

        @Override
        public boolean onTouch(View v, MotionEvent event) {
            // TODO Auto-generated method stub
            getActionBar().hide();
            return false;
        }
    });

我只是在主视图中添加了一个 onTouchListener

但我不知道如何实现getActionBar.show(); 方法。我如何确定用户是否在 2 秒内没有进行交互,从而实现 getActionBar().show();

提前谢谢...

编辑:

    protected String doInBackground(String... params) {
        // TODO Auto-generated method stub
        SystemClock.sleep(3000);

        if (isCancelled()) {
            break;
        }
        return null;
    }

此代码出错。 break can only be used inside loop or switch。 onCancelled()如何实现

【问题讨论】:

  • 不互动是指完全不触摸屏幕吗?
  • 是的,我就是这个意思。
  • 您可以设置一个 AsyncTask,在显示 ActionBar 之前在其中设置一个睡眠,如果用户触摸其他任何内容,则取消该任务。请参阅此处以取消任务stackoverflow.com/a/10882600/993600 我会在睡眠之后和显示 ActionBar 之前进行 isCancelled() 检查
  • 我应该使用SystemClock还是Thread.sleep(我猜是SystemClock
  • 我不是特别确定,以前没用过。我只是在谷歌上看看人们说哪个最好用。

标签: android android-actionbar show user-interaction


【解决方案1】:

最终,您必须跟踪用户交互。 看看这篇文章: tracking-user-idle-time-within-the-app-in-android

通过使用这个概念,您可以跟踪时间并优先保存。

现在剩余的逻辑仅用于在用户在一段时间内(假设为 2 秒)不活动时显示操作栏。

为此,您可以在Activity 中创建一个Thread定期(在您的情况下,每 2 秒)通过调用 getElapsed() method.if 检查上次用户交互时间getElapsed() 大于您想要的时间(2 秒)。然后使用 getActionBar().show() 方法显示操作栏。

【讨论】:

  • 嗨,我试过你的方法,它更容易实现,效率更高。谢谢。
【解决方案2】:

您可能正在寻找 FullScreenActivity 行为,例如 FullScreenActivity 模板中提供的行为。阅读更多信息:http://developer.android.com/tools/projects/templates.html#full-screen-activity

这样,您将免费获得经过良好测试的代码,其行为:自动隐藏操作栏并在有交互时将其显示回来。

【讨论】:

  • 是的,但对我来说是相反的。我想在用户交互时隐藏它并在空闲时间显示它
【解决方案3】:

您可以设置一个 AsyncTask,在显示 ActionBar 之前在其中设置一个睡眠,如果用户触摸其他任何内容,则取消该任务。 See here for canceling task。我会在睡眠之后和显示 ActionBar 之前进行 isCancelled() 检查

编辑:我会为你的问题做的是

protected String doInBackground(String... params) {
    // TODO Auto-generated method stub
    SystemClock.sleep(3000);

    if (!isCancelled()) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                //Show the actionbar code here
            }
        });
    }
    return null;
}

【讨论】:

  • 我手头没有,如果你把你的贴在你原来的帖子里,我看看能不能发现问题
  • 看我的帖子,试试看。
  • 我认为没有必要这样做。当您执行AsyncTask.cancel(true) 时,它会转到onCancelled() 而不是onPostExecute()。我需要做的就是在我的onTouch() 方法中执行TimerTask.execute 之前执行TimerTask.cancel()。基本上和你发的一样。但是谢谢,你帮了大忙!
  • 没问题,很高兴能帮上忙 :)
  • 嘿,还有一个问题。我应该把cancel(true);放在哪里?
猜你喜欢
  • 2011-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-09
  • 2014-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多