应用两个成功的setContentView时,First View不可见

时间:2013-01-01 18:30:14

标签: android

在加载我的Android应用程序期间,我想在启动的前2,3秒内显示一个徽标,我认为它不像在启动后看到UI那样难看。 因此,在我的代码中,我首先使用徽标(splash)和带有UI(main)的setContentView之后创建一个setContentView。 pb不是看到徽标屏幕,而是看到黑屏。 我在主线程中这样做,所以我不明白。 您是否对问题有解释,如果可能的话还有解决方法?

活动的onCreate()工作不正常如下(5秒内黑屏,之后可以看到UI,没有异常抛出):

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash); //doesn't work
    Log.i(TAG, Thread.currentThread().getName());
    //this.r
    try {
        Thread.sleep(5000);
    } catch (InterruptedException e) {
        Log.i(TAG, Thread.currentThread().getName() + e.toString() );
    }
    setContentView(R.layout.main); //work OK
}

}

如果我刚离开课程,下面的代码没有问题,我可以看到“第一个”和唯一的视图:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash); //work OK

} }

2 个答案:

答案 0 :(得分:4)

  

pb不是看到徽标屏幕,而是看到黑屏。

Thread.sleep()是错误的做法。您正在阻止所有发生,包括显示启动画面。

  

活动的onCreate()工作不正常如下(黑屏5秒后可以看到UI,没有异常抛出)

布局仅在 onResume()被调用后显示,因此通过阻止onCreate()中的UI线程,您已创建了空白屏幕。然后,当线程恢复时,两个布局都会被绘制,但是你将永远不会看到启动画面,因为几毫秒后会调用下一个setContentView()


虽然使用启动画面的想法值得商榷,但您应该在五秒钟后使用回调来更改布局。使用Handler和Runnable更改屏幕。

要插入我的个人意见,我会拒绝任何需要5秒钟加载的应用。每次打开应用程序时,我都会做更好的事情而不是查看徽标2-3秒。


虽然我喜欢ρяσѕρєяK的答案,但我会扮演魔鬼的拥护者。我更喜欢使用root View的内置处理程序:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    findViewById(android.R.id.content).postDelayed(new Runnable() {
        @Override
        public void run() {
            setContentView(R.layout.main);
        }
    }, 1000);
}

答案 1 :(得分:4)

您可以使用TimerTask代替使用Thread.sleep在主UI线程中等待:

new Timer().schedule(new TimerTask() {
    @Override
    public void run() {
        // use runOnUiThread for Updating Ui elements
        Your_Activity.this.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                 // set Activity Next layout Here
                setContentView(R.layout.main);
            }
        });
    }
}, 5000);