`
king_tt
  • 浏览: 2116818 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

分享到:
评论

相关推荐

    可以滑动界面切换tab

    可以滑动的界面切换tabhost package com.caigang.test; import android.app.TabActivity; import android.content.Intent; import android.os.Bundle; import android.view.GestureDetector; import android.view....

    LCRapidDevelop-master

    - 同时也欢迎大家的宝贵意见issues - 如果大家对MVP模式的开发 网络爬虫以及缓存策略感兴趣的话可以看看我最新写的[Freebook](https://github.com/80945540/FreeBook) - 邮箱:mychinalance@gmail.com - [API地址...

    高仿微信界面

    现在三个Fragment已经添加到了MainActivity中,滑动ViewPager切换Fragment,同时底部的导航栏也会切换,在为ViewPager添加监听以前,先说说底部导航栏。 第二步,底部导航。 这个的切换其实就是切换准备好的png...

    viewpager相关

    几个页面切换,用viewpager实现 package com.example.myviewpager; import java.util.ArrayList; import java.util.List; import android.app.Activity; import android.os.Bundle; import android.support.v4....

    Android开发中setContentView和inflate的区别分析

    本文实例讲述了Android开发中setContentView和inflate的区别。分享给大家供大家参考,具体如下: 一般用LayoutInflater做一件事:inflate inflate这个方法总共有四种形式(见下面),目的都是把xml表述的layout转化...

    android顶部滑动导航

    //设置此动画的加速度曲线 变化速率恒定 animation.setInterpolator(new LinearInterpolator()); //动画事件 animation.setDuration(400); animation.setFillAfter(true); //...

    滑动启动页

    setContentView(R.layout.guide); // 初始化页面 initViews(); // 初始化底部小点 initDots(); } private void initViews() { LayoutInflater inflater = LayoutInflater.from(this); views = ...

    可以滑动页面的项目

    setContentView(R.layout.activity_slider); SliderUtils.attachActivity(this, mConfig); } } or by extends: public class ExtendsActivity extends SliderActivity { } or by xml: xmlns:android=...

    全国城市检索

    setContentView(R.layout.main); provinceSpinner=(Spinner)findViewById(R.id.spinner1); citySpinner=(Spinner)findViewById(R.id.spinner2); districtSpinner=(Spinner)findViewById(R.id.spinner3); ...

    谈谈Android里的Context的使用

    这里MainView.java使用的布局main.xml代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_...

    SwipeListViewTest项目

    先来看activity_main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" xmlns:swipe=...

    GoogleNavigationDrawerMenu-侧滑menu菜单.zip

    DrawerLayout的封装,对于菜单是ListView的应用来说,这个库提供了更直接的使用方式,你不再需要去写menu的布局,如果你对DrawerLayout的使用没有信心,这个库使用起来可能会让你觉得简单些。项目地址:...

    JellyToolbar-果冻肉效果的Toolbar.zip

     editText = (AppCompatEditText) LayoutInflater.from(this).inflate(R.layout.edit_text, null);  editText.setBackgroundResource(R.color.colorTransparent);  toolbar.setContentView(editText);  }...

    SelectAll全选

    setContentView(R.layout.activity_main); /* 实例化各个控件 */ lv = (ListView) findViewById(R.id.lv); bt_selectall = (Button) findViewById(R.id.bt_selectall); // bt_cancel = (Button) ...

    package com.example.f1_telephone;

    setContentView(R.layout.activity_main); listView=(ListView) findViewById(R.id.listView); //得到ContentResolver对象 ContentResolver cr = getContentResolver(); //取得电话本中开始一项的光标 ...

    炫舞吧 android 游戏开发

    setContentView(mAnimView); } public boolean onTouchEvent(MotionEvent event) { // 获得触摸的坐标 int x = (int) event.getX(); int y = (int) event.getY(); switch (event.getAction()) { case ...

    andorid dialog 大合集

    import android.view.LayoutInflater; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.EditText; /** * by:宣雨松 * email:...

    自定义Dialog弹窗

    使用方法都有。public class BaseDialog extends Dialog { private View mContentView; public Context mContext; public LayoutInflater mInflater; public BaseDialog(Context context) { this(context, R....

    图片列表【范型】

    vi = LayoutInflater.from(MainActivity.this).inflate(R.layout.item3, null); //实例化控件 final ImageView iv = (ImageView) vi.findViewById(R.id.iv); final TextView text = (TextView)...

    gallery简单实现 图片调整

    LayoutInflater layoutInflater LayoutInflater from MainActivity this ; convertView layoutInflater inflate R layout picture null ; picture imageView ImageView convertView ...

Global site tag (gtag.js) - Google Analytics