等待后不显示布局

时间:2013-06-18 16:56:58

标签: android layout

我有三种布局:

Layout1
-->onClick()-->show
Layout2
-->wait three seconds-->show
Layout3

问题是没有显示Layout2。要设置我使用的布局

setContentView(int);

相关代码可能是:

public class TrainingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout1);
        final Button inputButton = (Button)findViewById(R.id.inputButton);
        inputButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                    changeLayouts();
            }
         });
    }
    public void changeLayouts() {
        setContentView(R.layout.layout2);
        try {
            TimeUnit.MILLISECONDS.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setContentView(R.layout.layout3);
    }
}

我的想法是,Android可能会使用类似“事件循环”(如Qt)的东西,我的方法会阻止控件返回“事件循环”,这会使布局显示出来。 但我找不到我的错误。

2 个答案:

答案 0 :(得分:1)

未显示layout2的原因是TimeUnit.MILLISECONDS.sleep(3000); - 你在这里做的是你的UI线程进入休眠状态,因此UI线程无法处理你的更改布局的请求。当它醒来时 - 会立即设置layout3,这就是layout2未显示的原因。

您可以考虑使用Handler.postDelayed(Runnable, long)推迟执行

所以这应该按照你的预期工作:

public class TrainingActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout1);
        final Button inputButton = (Button)findViewById(R.id.inputButton);
        inputButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                    changeLayouts();
            }
         });
    }
    public void changeLayouts() {
        setContentView(R.layout.layout2);
        Handler handler = new Handler();
        handler.postDelayed(new Runnable() {

            @Override
            public void run() {
                setContentView(R.layout.layout3);
            }
        }, 3000);

    }
}

答案 1 :(得分:0)

试试这个,它肯定会有用

    public void changeLayouts() {
         setContentView(R.layout.layout2);

        Thread Timer = new Thread(){
       public void run(){
          try{
              sleep(3000);
          } catch(InterruptedException e){
              e.printStackTrace();
          } finally {
               setContentView(R.layout.layout3);                
          }
       }    
    }; Timer.start();
}