近期对android里面控件修改做了很多实验,由于公司需求很多,不得不重写很多控件。程序目标无非是:高效、轻巧、清晰、标准化

完成动态加载Layout有两种方法,依据个人喜好进行选择:

方法1:静态主Layout动态加载静态子Layout

首先构建子Layout:main2

Xml代码 复制代码 收藏代码spinner.gif

  1. <? xml version = "1.0" encoding = "utf-8" ?>
  2. <!--布局可以任意定义,此处拿线性布局举例,里面有2个按钮元素-->
  3. < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android"
  4. android:id = "@+id/menubar"
  5. android:background = "@drawable/menubar"
  6. android:layout_width = "wrap_content"
  7. android:layout_height = "wrap_content" >
  8. <!--按钮1-->
  9. < ImageButton android:id = "@+id/button1"
  10. android:src = "@drawable/btn1"
  11. android:layout_width = "wrap_content"
  12. android:layout_height = "wrap_content"
  13. > </ ImageButton >
  14. <!--按钮2-->
  15. < ImageButton android:id = "@+id/button2"
  16. android:src = "@drawable/btn2"
  17. android:layout_width = "wrap_content"
  18. android:layout_height = "wrap_content"
  19. > </ ImageButton >
  20. </ LinearLayout >
<? xml version = "1.0" encoding = "utf-8" ?> <!--布局可以任意定义,此处拿线性布局举例,里面有2个按钮元素--> < LinearLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:id = "@+id/menubar" android:background = "@drawable/menubar" android:layout_width = "wrap_content" android:layout_height = "wrap_content" > <!--按钮1--> < ImageButton android:id = "@+id/button1" android:src = "@drawable/btn1" android:layout_width = "wrap_content" android:layout_height = "wrap_content" > </ ImageButton > <!--按钮2--> < ImageButton android:id = "@+id/button2" android:src = "@drawable/btn2" android:layout_width = "wrap_content" android:layout_height = "wrap_content" > </ ImageButton > </ LinearLayout >

然后构建主Layout:main

Xml代码 复制代码 收藏代码spinner.gif

  1. <? xml version = "1.0" encoding = "utf-8" ?>
  2. < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android"
  3. android:id = "@+id/background"
  4. android:layout_width = "fill_parent"
  5. android:layout_height = "fill_parent"
  6. android:background = "@drawable/background" >
  7. <!--主Layout要给子Layout设置一个容器box,可以在此指定容器的位置,这段是关键部分-->
  8. < LinearLayout android:id = "@+id/box"
  9. android:layout_alignParentBottom = "true"
  10. android:layout_width = "wrap_content"
  11. android:layout_height = "wrap_content"
  12. android:layout_centerHorizontal = "true" >
  13. </ LinearLayout >
  14. </ RelativeLayout >
<? xml version = "1.0" encoding = "utf-8" ?> < RelativeLayout xmlns:android = "http://schemas.android.com/apk/res/android" android:id = "@+id/background" android:layout_width = "fill_parent" android:layout_height = "fill_parent" android:background = "@drawable/background" > <!--主Layout要给子Layout设置一个容器box,可以在此指定容器的位置,这段是关键部分--> < LinearLayout android:id = "@+id/box" android:layout_alignParentBottom = "true" android:layout_width = "wrap_content" android:layout_height = "wrap_content" android:layout_centerHorizontal = "true" > </ LinearLayout > </ RelativeLayout >

最后在程序中加载子layout:

Java代码 复制代码 收藏代码spinner.gif

  1. public class  BackgroundTest  extends  Activity {    
  2. /** Called when the activity is first created. */
  3. //      子Layout要以view的形式加入到主Layout中   
  4. private  View mBarView;    
  5. //      主Layout的容器加载子Layout的View   
  6. private  LinearLayout mLinearLayout;    
  7. //给出关键内容   
  8. public void  onCreate(Bundle savedInstanceState) {    
  9. super .onCreate(savedInstanceState);    
  10. //      显示主Layout   
  11.         setContentView(R.layout.main);     
  12. //      加载子Layout          
  13.         mBarView = View.inflate(this , R.layout.main2,  null );    
  14. //      找到容器   
  15.         mLinearLayout = (LinearLayout)findViewById(R.id.box);    
  16. //      加上View 结束   
  17.         mLinearLayout.addView(mBarView);   
public class BackgroundTest extends Activity { /** Called when the activity is first created. */ // 子Layout要以view的形式加入到主Layout中 private View mBarView; // 主Layout的容器加载子Layout的View private LinearLayout mLinearLayout; //给出关键内容 public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); // 显示主Layout setContentView(R.layout.main); // 加载子Layout mBarView = View.inflate(this , R.layout.main2, null ); // 找到容器 mLinearLayout = (LinearLayout)findViewById(R.id.box); // 加上View 结束 mLinearLayout.addView(mBarView);

方法2:静态主Layout动态加载动态的Layout

首先构造你自己的子Layout和上面一样;

然后构建你自定义的Layout类:

Java代码 复制代码 收藏代码spinner.gif

  1. public class  MenuLandscapeLinearLayout  extends  LinearLayout{     
  2. //  构造函数   
  3. public  MenuLandscapeLinearLayout(Context context) {    
  4. super (context);    
  5. // TODO Auto-generated constructor stub   
  6. //加载需要的属性,加载方法一的子Layout   
  7.     ((Activity) getContext()).getLayoutInflater().inflate(R.layout.main2, this );     
  8. //在此你可以封装很多方法    
  9.     }       
  10. }   
public class MenuLandscapeLinearLayout extends LinearLayout{ // 构造函数 public MenuLandscapeLinearLayout(Context context) { super (context); // TODO Auto-generated constructor stub //加载需要的属性,加载方法一的子Layout ((Activity) getContext()).getLayoutInflater().inflate(R.layout.main2, this ); //在此你可以封装很多方法 } }

最后在程序中动态实例化并加载即可:

Java代码 复制代码 收藏代码spinner.gif

  1. public class  BackgroundTest  extends  Activity {    
  2. /** Called when the activity is first created. */
  3. private  LinearLayout mLinearLayout;    
  4. //声明一个子Layout View对象   
  5. private  MenuLandscapeLinearLayout mMenuLandscapeLinearLayout;    
  6. @Override
  7. public void  onCreate(Bundle savedInstanceState) {    
  8. super .onCreate(savedInstanceState);    
  9. //      加载主Layout   
  10.         setContentView(R.layout.main);      
  11. //      找到容器         
  12.         mLinearLayout = (LinearLayout)findViewById(R.id.box);    
  13. //      实例化一个子View   
  14.         mMenuLandscapeLinearLayout=new  MenuLandscapeLinearLayout( this );    
  15. //      添加到容器   
  16.         mLinearLayout.addView(mMenuLandscapeLinearLayout);    
  17.     }    
  18. }   
public class BackgroundTest extends Activity { /** Called when the activity is first created. */ private LinearLayout mLinearLayout; //声明一个子Layout View对象 private MenuLandscapeLinearLayout mMenuLandscapeLinearLayout; @Override public void onCreate(Bundle savedInstanceState) { super .onCreate(savedInstanceState); // 加载主Layout setContentView(R.layout.main); // 找到容器 mLinearLayout = (LinearLayout)findViewById(R.id.box); // 实例化一个子View mMenuLandscapeLinearLayout=new MenuLandscapeLinearLayout( this ); // 添加到容器 mLinearLayout.addView(mMenuLandscapeLinearLayout); } }

至此,完成了动态加载子Layout的两种形式,里面可思考的很多,比如封装常用事件、资源,从而节省代码、节省资源;

抛砖引玉,分享经验,希望能助大家优化自己的程序。