Android实现欢迎页:在onCreate方法中两次调用setContentView

        首先,要知道,setContentView方法的用途就是加载布局文件。

        在做Android开发的时候,有时候需要在一个Activity的里面调用两次setContentView方法。比如在应用启动的时候,开始显示欢迎界面,在显示欢迎界面的同时,进行后台数据的处理,等到后台数据准备好了,才显示真正的应用界面。这样的做法不会让使用者有突兀的感觉。反之,应用已启动就显示真正的应用界面,但在后续的操作需要准备数据的时候,假定是5秒钟,那么在这5秒钟内使用者将无法使用该应用,这样用户界面显然是不够友好的。
        为了实现欢迎界面,大家很自然地就会想到:在onCreate方法中,调用两次setContentView。是的,要调用两次setContentView,但怎么调用还是有点技巧,而不是简单地调用两次setContentView就可以解决问题的。下面,我们就用实际的例子来给予说明。

        下面来完善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方法,只有最后一次才是有效的。 那么怎样解决我们在开始提出的问题呢?即应用启动的时候,显示欢迎界面,过几秒后,再显示真正的应用程序界面呢?下面的解决办法,供大家参考,具体做法:                                  

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);//曾想注掉这句话,直接调用setContentView(R.layout.main),但报异常
                             }
                    };
                    Thread thread = new Thread(runnable);
                    thread.start();           
    }
}

这样就可以做到先显示欢迎界面5秒钟,然后再显示真正的应用程序界面。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值