【问题标题】:android set visibility of a button on timerandroid在计时器上设置按钮的可见性
【发布时间】:2010-08-02 22:01:56
【问题描述】:

我有一个应用程序在程序开始时显示免责声明。我希望一个按钮在一段时间内保持不可见,然后变为可见。 我设置了一个休眠 5 秒的线程,然后尝试使按钮可见。但是,当我执行代码时出现此错误:

08-02 21:34:07.868: ERROR/AndroidRuntime(1401): android.view.ViewRoot$CalledFromWrongThreadException: 只有创建视图层次结构的原始线程才能接触其视图。

如何计算 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);
      }

【问题讨论】:

    标签: android multithreading button view timer


    【解决方案1】:

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

    所以不是

    okButton.setVisibility(View.VISIBLE)
    

    你应该这样做

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

    【讨论】:

    • 我们能找到类似的东西吗,ListView 的特定视图部分从 3(任何时间实例)秒开始可见。
    【解决方案2】:

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

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

    【讨论】:

    • 哇,这个没问题!
    • 在 2017 年仍然可以正常工作,需要延迟在 searchView 中关闭我的 listView 以使 softInPutMode 先关闭,然后是 listView afterwords。对于 ConstraintLayout 中的跳跃视图,通过 softInputMode 的上升和关闭,这是一个很好的解决方法。
    【解决方案3】:

    我发现这是解决问题的更好方法 (按钮 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"
    

    【讨论】:

    • 谢谢兄弟,这非常有帮助。
    猜你喜欢
    • 2019-12-09
    • 2013-11-30
    • 2011-09-02
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 2015-09-25
    • 2012-01-20
    • 1970-01-01
    相关资源
    最近更新 更多