“setContentView”真的有用吗?

时间:2011-12-18 03:40:15

标签: android

在我的主要活动中,我想设置它,以便我首先遇到contentView只显示背景和一些文本。 X秒后,我想更改为我的其他视图(GLSurfaceView)。

这显然是我做错了。

这就是我想象它可以完成的方式(全部采用onCreate方法):

setContentView(R.layout.main);

try {
    Thread.sleep(10000);
} catch (InterruptedException e) {
}

viewer = new Viewer(this);

setContentView(viewer);

布局Main是我想要在开头显示的内容,Viewer是我的GLSurfaceView类。

它会变成黑色10秒然后开始加载我通过OpenGLES显示的对象。

布局Main没有任何问题,因为如果我只删除Thread.sleep采取行动的地方线下它就行了。但是,在Thread.sleep结束之前没有任何事情发生......

话虽如此,我的问题如下:

  • 为什么contentView在完成 Thread.sleep之后才会改变?
  • 对于我想要实现的目标,什么是合适的解决方案?

4 个答案:

答案 0 :(得分:10)

我在你的onCreate()中假设这个,这就是为什么你什么也看不见。

我实现这个的方法是在doInBackground中使用AsyncTask sleep启动一个线程,并在onPostExecute中设置新视图。

答案 1 :(得分:2)

不要让睡眠成为主线程(UI线程)。对于那种类型的作品,请使用threadsAsynkTas k或TimerTask

答案 2 :(得分:2)

你没有像你想象的那样沉睡UI线程。

您希望实现的最简单的方法是将视图分离为单独的活动,让Android处理视图之间的转换。它为您的代码库添加了另一个文件,但它非常简单。假设您的初始普通视图(R.layout.main)适用于SplashActivity活动,并且您的启动后视图会转到PostSplashActivity。然后你可以做这样的事情:

public class SplashActivity extends Activity {
    private static long DELAY = 10000; //milliseconds;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    new Handler().postDelayed(
            new Runnable() {
                @Override
                public void run() {
                    Intent postSplash = new Intent(SplashActivity.this, PostSplashActivity.class);
                    SplashActivity.this.startActivity(postSplash);
                    SplashActivity.this.finish();
                }
            }, DELAY);
    }
}

这会绘制您的R.layout.main布局,然后对您的startActivity进行PostSplashActivity调用,并告诉队列等待DELAY毫秒来执行它

答案 3 :(得分:0)

听起来你想要像闪屏一样的东西。我想将这些视为与以下屏幕分开,因此总是使用单独的活动而不是两次调用setContentView。你仍然需要睡在一个线程中。

虽然只是个人偏好......