setContentView+LayoutInflater=完美切换页面(两者一定要同时使用,setContentView提高切换页面速度必看)setContentView的秘密----续上...

http://blog.csdn.net/yanzi1225627/article/details/7802018这里的问题我已经找到了答案.

setContentView的秘密:

当activity 调用 setContentView() 时,android 才会去绘制 layout 上的各个元素,并为其分配内存。只有分配了内存以后,才能继续执行findViewById(); 才能得到引用,不然得到空引用。空引用意味着,后面使用相应变量时就会发生访问的对象不存在的问题。当Activity重新setContentView()以后,那些之前绘制的控件,内存都被灭掉了所以,若是通过setContentView 来达到画面切换目的的,要注意重新绘制以后重新取得引用。

--------(参考:http://www.go2solo.net/2011/07/08/setcontentview%E7%9A%84%E7%A7%98%E5%AF%86.html

http://blog.csdn.net/simplty/article/details/7036773

什么是LayoutInflater?

LayoutInflater的作用就相当于findViewById,只不过后者是查找一些小的widget,如button、textview,而前者是查找layout文件下的.xml布局文件。也就是说:LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。这样也就解决了setContentView后还要findViewById的问题,因为这里是实例化的view对象,通过这个view去setContentView,而且还能有效保存切换页面前的内容。

因此,我将程序修改成这个样子:

public class MainActivity extends Activity {
View layoutMain = null;
View layoutSecond = null;
Button btn_mainActivity = null;
Button btn_secondActivity;
boolean firstFlag = true;
long time = (long)0.0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
LayoutInflater inflater = this.getLayoutInflater();
layoutMain = inflater.inflate(R.layout.activity_main, null);
layoutSecond = inflater.inflate(R.layout.activity_second, null);
setContentView(layoutMain);

btn_mainActivity = (Button)findViewById(R.id.btn_mainAc_1);
btn_mainActivity.setOnClickListener(new ButtonListen());


}

class ButtonListen implements OnClickListener{

public void onClick(View v) {
// TODO Auto-generated method stub
time = System.currentTimeMillis();
switch(v.getId()){
case R.id.btn_mainAc_1:
Jump2Second();
break;
case R.id.btn_secondA_1:
Jump2Main();
break;
default:
break;
}
}

}
public void Jump2Second(){
setContentView(layoutSecond);
long currTime = System.currentTimeMillis();
Toast.makeText(MainActivity.this,
"切换耗时:" +String.valueOf(currTime-time)+"毫秒",
Toast.LENGTH_SHORT).show();
if(firstFlag){
btn_secondActivity = (Button)findViewById(R.id.btn_secondA_1);
btn_secondActivity.setOnClickListener(new ButtonListen());
firstFlag = false;
}

}
public void Jump2Main(){
setContentView(layoutMain);
long currTime = System.currentTimeMillis();
Toast.makeText(MainActivity.this,
"切换耗时:" +String.valueOf(currTime-time)+"毫秒",
Toast.LENGTH_SHORT).show();
}
}

这里要注意,firstFlag的使用,判断是否第一次跳转至second界面,如果是第一次的话则findViewById然后监听,只需要绑定一次就可以了。而且这个绑定必须在跳转函数里,不能在onCreate方法里。为什么呢?因为在onCreate方法里setContentView(layoutMain),系统只为layoutMain里的元素分配了内存,并没有为layoutSecond上的元素分配内存,尽管这里用view将其实例化对象里。(这块表述可能不准确,欢迎大神们指点

总之,没有setContentView(第二个界面)之前,第二个界面里的元素虽然能够find到,eclipse没有报错,但因为没有被分配内存,所以在onCreate这里为第二个界面绑定监听是错误的!你运行的时候程序会直接挂掉。

记住:setContentView之后才为布局里的元素分配内存,在未分配内存前对元素进行访问时没有意义的!!!

源码下载:http://download.csdn.net/detail/yanzi1225627/4464762

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值