首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >等待后未显示布局

等待后未显示布局
EN

Stack Overflow用户
提问于 2013-06-19 00:56:58
回答 2查看 179关注 0票数 0

我有三个布局:

代码语言:javascript
复制
Layout1
-->onClick()-->show
Layout2
-->wait three seconds-->show
Layout3

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

代码语言:javascript
复制
setContentView(int);

相关代码可能是:

代码语言:javascript
复制
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可能使用类似"Event-Loop“的东西(如Qt),我的方法将阻塞控件以返回到"Event-Loop”,这将使布局显示。但是我找不到我的错误。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-06-19 01:17:21

您的layout2没有显示的问题是因为TimeUnit.MILLISECONDS.sleep(3000); -您在这里所做的是将您的UI线程置于睡眠状态,因此UI线程无法处理您更改布局的请求。当它被唤醒时-它会立即设置layout3,这就是为什么layout2没有显示。

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

因此,这应该会像您预期的那样工作:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-09-17 17:39:40

试试这个,一定行得通。

代码语言:javascript
复制
    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();
} 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17174676

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档