如何在用户不触及屏幕时隐藏布局?

时间:2011-12-09 06:48:26

标签: android

我在屏幕触摸时使用OnTouchListener来显示layout1。 现在我想要隐形布局1而屏幕没有触摸三秒钟。 但我不知道我可以使用哪个事件监听器?

现在问题已经解决了。 但另一个出现了。 我用:

class unTouchTask extends TimerTask {
public void run() {
if(untouch == true) {
RelativeLayout rl = (
RelativeLayout)findViewById(R.id.relativeLayout2);
rl.setVisibility(View.INVISIBLE);
timer.cancel();
untouch = false;}
}
    }

rl.setVisibility(View.INVISIBLE);行下方的错误:

android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

3 个答案:

答案 0 :(得分:1)

您可以使用Timer和TimerTask来安排在某个时间间隔内发生的事情。 如果用户曾触摸屏幕,请取消定时器并重置。您将需要UI线程中的UI相关内容。这个article会给你一个想法。

答案 1 :(得分:1)

选项1:您需要运行定时器来跟踪用户的非活动时间,并且在每次用户触摸时都需要重置定时器。

按如下方式对您的计时器进行编码:

class UpdateTimeTask extends TimerTask {
   public void run() {

       //hide your layout

   }

}

在事件监听器中启动此更新时,使用以下Timer()实例:

if(startTime == 0L) {
   startTime = evt.getWhen();
   timer = new Timer();
   timer.schedule(new UpdateTimeTask(), 300, 200);
}

注意:特别要注意300,200个参数。第一个参数表示在第一次运行时钟更新任务之前等待300 ms。第二个意思是在此之后每200ms重复一次,直到停止。

选项2:幸运的是,Timer的角色可以被android.os.Handler类替换,只需要一些调整

您可以在http://www.vogella.de/articles/AndroidPerformance/article.html

获取更详细的示例

问候。

答案 2 :(得分:1)

您收到此错误是因为您可以使用线程但所有视图以及所有与视图相关的API都必须从主线程(也称为UI线程)调用。因此解决方法是使用Handler。 Handler是一个将消息发送回UI线程的对象。 http://developer.android.com/reference/android/os/Handler.html将指导您编写代码处理程序。

第二个选项是使用 runOnUiThread 。以下是我在线程中所做的事情:

runOnUiThread(new Runnable() {
    public void run() {
        titleProgress.setVisibility(View.VISIBLE);
    }
});
//long operation here
runOnUiThread(new Runnable() {
    public void run() {
       titleProgress.setVisibility(View.INVISIBLE);
    }
});