“setContentView”究竟做了什么?

问题描述:

在我的主要活动中,我想让它首先通过contentview来展示背景和文字。 X秒后,我希望我改变到我的其他视图(GLSurfaceView)。“setContentView”究竟做了什么?

这显然是我做的完全错误的事情。

这是我所想象它可以一直做(这是所有在OnCreate)

setContentView(R.layout.main); 

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

    viewer = new Viewer(this); 

    setContentView(viewer); 

在哪里布局主要是想我想在开始就表现出和浏览器是我GLSurfaceView类。

会发生什么,它只是beeing黑色10秒,然后开始加载我通过OpenGL(ES)显示的对象。

布局“主”没什么错,因为它的工作原理如果我只是在线程休眠的地方擦除线以下采取行动。芹苴什么也没有发生之前的Thread.sleep结束...

虽这么说,我的问题是下面

  • 为什么内容查看不改变,直到了Thread.sleep完成后?
  • 什么是适当的解决方案,我想实现什么?

我假设这在你的onCreate(),这就是为什么你什么都看不到。

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

看来你正在让主线程睡眠。这可能是代码运行之后告诉的原因。

不要让睡眠成为主线程(UI线程)。请使用threadsAsynkTas k或TimerTask代替该类型的作品。

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

只是个人喜好,但...

你不睡在你认为你的方式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毫秒去执行它。