Android计时器设置按钮可见性

14

我有一个应用程序,在程序开始时显示免责声明。我想让一个按钮在设置的一段时间内保持不可见,然后变为可见。

我设置了一个线程,让它睡眠5秒钟,然后试图使按钮可见。但是,当我执行代码时,出现以下错误:

08-02 21:34:07.868: ERROR/AndroidRuntime(1401): android.view.ViewRoot$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

如何计算5秒钟,然后使按钮可见? 谢谢。

Thread splashTread = new Thread() {
           @Override
           public void run() {
            try {
                   int waited = 0;
                   while(_active && (!_ok2)) {
                       sleep(100);
                       if(_active) {
                           waited += 100;
                           if(waited >= _splashTime)
                           {
                            turnButtonOn();
                           }

                       }
                   }
               } catch(InterruptedException e) {
                   // do nothing
               } finally {
                   finish();
                   startActivity(new Intent("com.lba.mixer.Choose"));

               }
    };
    splashTread.start();


      public static void turnButtonOn() {
         okButton.setVisibility(View.VISIBLE);
      }
3个回答

56
问题在于当你创建并运行自己的线程时,调用okButton.setVisibility(View.VISIBLE);时你不在UI线程中。你需要获取按钮的处理程序,并通过该处理程序获取的UI线程设置可见性。

因此,你需要获取按钮的handler,并通过该handler获取的UI线程来设置可见性,而不是在非UI线程中直接调用setVisibility函数。

okButton.setVisibility(View.VISIBLE)

你应该这样做

okButton.getHandler().post(new Runnable() {
    public void run() {
        okButton.setVisibility(View.VISIBLE);
    }
});

我们能否找到类似的东西,即ListView的特定视图部分在3秒钟内可见(任何时间实例)? - Tushar Pandey

27

我发现这是一个更简单的解决方案。可见性延迟7秒

continuebutton.setVisibility(View.INVISIBLE);
continuebutton.postDelayed(new Runnable() {
        public void run() {
            continuebutton.setVisibility(View.VISIBLE);
        }
    }, 7000);

哇,这个没问题! - Sonhja
在2017年仍然有效,需要延迟关闭searchView中listView的操作,以使softInPutMode先关闭,然后再关闭listView。这是ConstraintLayout中视图跳动的一个很好的解决方法,可以通过上升和关闭softInputMode来实现。 - iBEK

2
我发现这是一个更好的解决问题的方法(按钮ID = but_resend)。
定义处理程序。
  private Handler handler;

在扩展类中调用函数

 showButtons();

在类之后定义

private void showButtons() {
        handler = new Handler();

        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                ((Button) findViewById(R.id.but_resend)).setVisibility(View.VISIBLE);
            }
        }, 20000); // produce 20 sec delay in button visibility


    }

请注意,在.xml文件中隐藏可见性。

android:visibility="invisible"

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接