AndroidGUI28:在onCreate方法中两次调用setContentView
2014-09-28 17:56
363 查看
From: http://blog.csdn.net/pathuang68/article/details/6713498
在做Android开发的时候,有时候需要在一个Activity的里面调用两次setContentView方法。比如在应用启动的时候,开始显示欢迎界面,在显示欢迎界面的同时,进行后台数据的处理,等到后台数据准备好了,才显示真正的应用界面。这样的做法不会让使用者有突兀的感觉。反之,应用已启动就显示真正的应用界面,但在后续的操作需要准备数据的时候,假定是5秒钟,那么在这5秒钟内使用者将无法使用该应用,这样用户界面显然是不够友好的。
为了实现欢迎界面,大家很自然地就会想到:在onCreate方法中,调用两次setContentView。是的,要调用两次setContentView,但怎么调用还是有点技巧,而不是简单地调用两次setContentView就可以解决问题的。下面,我们就用实际的例子来给予说明。
1. 在Eclipse中,先如下创建一个项目:
2. 将图片mm.png拷贝到项目的res/drawable-mdpi文件夹下,这个图片将用作欢迎界面。mm.png的图片是这样的:
3. 修改原项目的main.xml(假定它是真正的应用界面),使之如下:
你将会发现,欢迎界面根本没有出现。在本该出现欢迎界面的时候,界面上什么也没有,过了几秒钟(程序中指定的5秒钟),然后就直接显示:
如果把上面程序中的两条setContentView语句的位置互换,程序开始运行的时候界面上什么也没有,过了几秒钟(程序中指定的5秒钟),然后就直接显示欢迎界面:
从现象上看,似乎只有最后那个setContentView语句才会起作用。事实上,的确是这样的。setContentView方法所指定的View,只有在onCreate方法返回后才会显示在界面上。因此,如果调用了两次setContentView方法,只有最后一次才是有效的。
6. 那么怎样解决我们在开始提出的问题呢?即应用启动的时候,显示欢迎界面,过几秒后,再显示真正的应用程序界面呢?网上给出了几种界面办法,但个人认为都不是什么好办法。我在网上所能找到最靠谱的解决办法是这个帖子中的2楼给出的办法,其他所看到的办法基本上都是在误人,因此特提出下面的解决办法,供大家参考。这个解决办法和前面提及的帖子的思路差不多,但应该更简单一些。具体做法:
第1~4步的工作维持不变,仅将WelcomeActivity.java的代码修改,使之如下:
上面代码的粗体字部分,均为修改步骤5中的代码所增加的。
这样就可以做到先显示欢迎界面5秒钟,然后再显示真正的应用程序界面。
在做Android开发的时候,有时候需要在一个Activity的里面调用两次setContentView方法。比如在应用启动的时候,开始显示欢迎界面,在显示欢迎界面的同时,进行后台数据的处理,等到后台数据准备好了,才显示真正的应用界面。这样的做法不会让使用者有突兀的感觉。反之,应用已启动就显示真正的应用界面,但在后续的操作需要准备数据的时候,假定是5秒钟,那么在这5秒钟内使用者将无法使用该应用,这样用户界面显然是不够友好的。
为了实现欢迎界面,大家很自然地就会想到:在onCreate方法中,调用两次setContentView。是的,要调用两次setContentView,但怎么调用还是有点技巧,而不是简单地调用两次setContentView就可以解决问题的。下面,我们就用实际的例子来给予说明。
1. 在Eclipse中,先如下创建一个项目:
2. 将图片mm.png拷贝到项目的res/drawable-mdpi文件夹下,这个图片将用作欢迎界面。mm.png的图片是这样的:
3. 修改原项目的main.xml(假定它是真正的应用界面),使之如下:
<?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:textSize="40dip" android:textColor="#FFFF00" android:text="This is the real application interface!" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="OK" /> </LinearLayout> 4. 再增加一个布局文件welcome.xml,用做欢迎界面。编辑该文件,使其内容如下: <?xml version="1.0"encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <ImageView android:layout_width="fill_parent" android:layout_height="fill_parent" android:scaleType="center" android:src="@drawable/mm" /> </LinearLayout> 很显然,这个欢迎界面就是显示步骤2增加的图片mm.png 5. 下面来完善WelcomeActivity.java的代码,如果我们像下面这样直接写: package com.pat.welcome; import android.app.Activity; import android.os.Bundle; public class WelcomeActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); // 把这一句改为下面一句,用以显示欢迎界面 setContentView(R.layout.welcome); // 下面是模拟数据处理需要5秒钟的时间 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } setContentView(R.layout.main); // 显示真正的应用界面 } }
你将会发现,欢迎界面根本没有出现。在本该出现欢迎界面的时候,界面上什么也没有,过了几秒钟(程序中指定的5秒钟),然后就直接显示:
如果把上面程序中的两条setContentView语句的位置互换,程序开始运行的时候界面上什么也没有,过了几秒钟(程序中指定的5秒钟),然后就直接显示欢迎界面:
从现象上看,似乎只有最后那个setContentView语句才会起作用。事实上,的确是这样的。setContentView方法所指定的View,只有在onCreate方法返回后才会显示在界面上。因此,如果调用了两次setContentView方法,只有最后一次才是有效的。
6. 那么怎样解决我们在开始提出的问题呢?即应用启动的时候,显示欢迎界面,过几秒后,再显示真正的应用程序界面呢?网上给出了几种界面办法,但个人认为都不是什么好办法。我在网上所能找到最靠谱的解决办法是这个帖子中的2楼给出的办法,其他所看到的办法基本上都是在误人,因此特提出下面的解决办法,供大家参考。这个解决办法和前面提及的帖子的思路差不多,但应该更简单一些。具体做法:
第1~4步的工作维持不变,仅将WelcomeActivity.java的代码修改,使之如下:
package com.pat.welcome; import android.app.Activity; import android.os.Bundle; import android.os.Handler; import android.os.Message; public class WelcomeActivity extends Activity { private Handler handler; // 声明handler @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); //setContentView(R.layout.main); // 把这一句改为下面一句 setContentView(R.layout.welcome); // 初始化handler handler = new Handler() { @Override public void handleMessage(Message msg) { if(msg.what == 1) // handler接收到相关的消息后 { setContentView(R.layout.main); // 显示真正的应用界面 } } }; // 新建一个线程,过5秒钟后向handler发送一个消息 Runnable runnable = newRunnable() { public void run() { try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } handler.sendEmptyMessage(1); } }; Thread thread = new Thread(runnable); thread.start(); // // 下面是模拟数据处理需要5秒钟的时间 // try // { // Thread.sleep(5000); // } // catch (InterruptedException e) // { // e.printStackTrace(); // } // // setContentView(R.layout.main); } }
上面代码的粗体字部分,均为修改步骤5中的代码所增加的。
这样就可以做到先显示欢迎界面5秒钟,然后再显示真正的应用程序界面。
相关文章推荐
- AndroidGUI28:在onCreate方法中两次调用setContentView
- Android实现欢迎页:在onCreate方法中两次调用setContentView
- android开发 Activity的里面调用两次 setContentView方法
- Android中一个Activity第二次启动时,onCreate()调用setContentView()方法时出错,程序崩溃
- Android OnCreate、setContentView方法
- onCreate方法中调用PopupWindow的错误:android.view.WindowManager$BadTo
- Android源码分析-深入理解setContentView方法
- 从setContentView方法分析Android加载布局流程
- 为什么requestWindowFeature()方法要在setContentView()方法之前调用?
- Android setContentView方法解析(二)
- Android view.setVisibility()后调用layout()方法无效的问题
- setContentView()调用SurfaceView布局文件出错的解决方法
- Android之Inflate()方法用途+setContentView和inflate区别
- onCreate方法中调用PopupWindow的错误:android.view.WindowManager$BadTo
- 【ANDROID】Android 在oncreate() 方法中调用 findViewById 返回 null 问题的原因和解决方法
- Android之Inflate()方法用途+setContentView和inflate区别
- 从setContentView方法分析Android加载布局流程
- Android之Inflate()方法用途+setContentView和inflate区别
- Android之Inflate()方法用途+setContentView和inflate区别
- Android控件架构以及setContentView()方法剖析