android 通过setContentView切换Activity的View

android 通过setContentView切换Activity的View,保存动态修改后的视图

使用setContentView可以在Activity中动态切换显示的View,这样,不需要多个Activity就可以显示不同的界面,因此不再需要在Activity间传送数据,变量可以直接引用。但是,在android SDK给我们建的默认的Hello World程序中,调用的是setContentView(int layoutResID)方法,如果使用该方法切换view,在切换后再切换回,无法显示切换前修改后的样子,也就是说,相当于重新显示一个view,并非是把原来的view隐藏后再显示。其实setContentView是个多态方法,我们可以先用LayoutInflater把布局xml文件引入成View对象,再通过setContentView(View view)方法来切换视图。因为所有对View的修改都保存在View对象里,所以,当切换回原来的view时,就可以直接显示原来修改后的样子。
下面是代码,main.xml:

  
  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView android:id="@+id/tv1"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="main.xml"
  11. />
  12. <Button android:id="@+id/b1"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:text="切换到main2.xml"
  16. />
  17. <Button android:id="@+id/b3"
  18. android:layout_width="fill_parent"
  19. android:layout_height="wrap_content"
  20. android:text="修改tv1"
  21. />
  22. </LinearLayout>

main2.xml:

  
  
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:orientation="vertical"
  4. android:layout_width="fill_parent"
  5. android:layout_height="fill_parent"
  6. >
  7. <TextView android:id="@+id/tv2"
  8. android:layout_width="fill_parent"
  9. android:layout_height="wrap_content"
  10. android:text="main2.xml"
  11. />
  12. <Button android:id="@+id/b2"
  13. android:layout_width="fill_parent"
  14. android:layout_height="wrap_content"
  15. android:text="切换到main.xml"
  16. />
  17. </LinearLayout>

Java 代码:

  
  
  1. package com.pocketdigi.changeView;
  2.  
  3. import android.app.Activity;
  4. import android.os.Bundle;
  5. import android.view.LayoutInflater;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. import android.widget.TextView;
  10.  
  11. public class Main extends Activity {
  12. /** Called when the activity is first created. */
  13. TextView tv1, tv2;
  14. Button b1, b2,b3;
  15. View layout1, layout2;
  16. boolean view2Load=false;//main2是否载入过的flag
  17. @Override
  18. public void onCreate(Bundle savedInstanceState) {
  19. super.onCreate(savedInstanceState);
  20. //LayoutInflater inflater = getLayoutInflater();
  21. LayoutInflater inflater = LayoutInflater.from(this);
  22. //以上两行功能一样
  23. layout1 = inflater.inflate(R.layout.main, null);
  24. layout2 = inflater.inflate(R.layout.main2, null);
  25. setView1();
  26. tv1 = (TextView) findViewById(R.id.tv1);
  27. b1 = (Button) findViewById(R.id.b1);
  28. b3 = (Button) findViewById(R.id.b3);
  29. b3.setOnClickListener(l3);
  30. b1.setOnClickListener(l1);
  31. //控件及监听器只需一次查找绑定,切换view不影响
  32. }
  33.  
  34. private void setView1() {
  35. setContentView(layout1);
  36. //切换到main
  37. }
  38.  
  39. private void setView2() {
  40. setContentView(layout2);
  41. //切换到main2
  42. find();
  43. }
  44. private void find(){
  45. if(!view2Load){//如果首次显示main2,查找main2里的控件并绑定监听器
  46. tv2 = (TextView) findViewById(R.id.tv2);
  47. b2 = (Button) findViewById(R.id.b2);
  48. b2.setOnClickListener(l2);
  49. view2Load=true;//flag设为true
  50. }
  51. }
  52.  
  53. OnClickListener l1 = new OnClickListener() {
  54.  
  55. @Override
  56. public void onClick(View v) {
  57. // TODO Auto-generated method stub
  58. setView2();
  59. }
  60. };
  61. OnClickListener l2 = new OnClickListener() {
  62.  
  63. @Override
  64. public void onClick(View v) {
  65. // TODO Auto-generated method stub
  66. setView1();
  67. }
  68.  
  69. };
  70. OnClickListener l3 = new OnClickListener() {
  71.  
  72. @Override
  73. public void onClick(View v) {
  74. // TODO Auto-generated method stub
  75. tv1.setText("已修改");
  76. //修改tv2的值,切换到main2后再切换回来,可以发现tv1的值被保存了,还是"已修改"
  77. }
  78.  
  79. };
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值