思捻如枫 2011-06-08
android:静态XML和动态加载XML混合使用,以及重写Layout控件收藏
近期对android里面控件修改做了很多实验,由于公司需求很多,不得不重写很多控件。程序目标无非是:高效、轻巧、清晰、标准化
完成动态加载Layout有两种方法,依据个人喜好进行选择:
方法1:静态主Layout动态加载静态子Layout
首先构建子Layout:main2
viewplaincopytoclipboardprint?
<?xmlversion="1.0"encoding="utf-8"?>
<!--布局可以任意定义,此处拿线性布局举例,里面有2个按钮元素-->
<LinearLayoutxmlns: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-->
<ImageButtonandroid:id="@+id/button1"
android:src="@drawable/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ImageButton>
<!--按钮2-->
<ImageButtonandroid:id="@+id/button2"
android:src="@drawable/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ImageButton>
</LinearLayout>
<?xmlversion="1.0"encoding="utf-8"?>
<!--布局可以任意定义,此处拿线性布局举例,里面有2个按钮元素-->
<LinearLayoutxmlns: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-->
<ImageButtonandroid:id="@+id/button1"
android:src="@drawable/btn1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ImageButton>
<!--按钮2-->
<ImageButtonandroid:id="@+id/button2"
android:src="@drawable/btn2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
></ImageButton>
</LinearLayout>
然后构建主Layout:main
viewplaincopytoclipboardprint?
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns: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,可以在此指定容器的位置,这段是关键部分-->
<LinearLayoutandroid:id="@+id/box"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true">
</LinearLayout>
</RelativeLayout>
<?xmlversion="1.0"encoding="utf-8"?>
<RelativeLayoutxmlns: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,可以在此指定容器的位置,这段是关键部分-->
<LinearLayoutandroid:id="@+id/box"
android:layout_alignParentBottom="true"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true">
</LinearLayout>
</RelativeLayout>
最后在程序中加载子layout:
viewplaincopytoclipboardprint?
publicclassBackgroundTestextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
//子Layout要以view的形式加入到主Layout中
privateViewmBarView;
//主Layout的容器加载子Layout的View
privateLinearLayoutmLinearLayout;
//给出关键内容
publicvoidonCreate(BundlesavedInstanceState){
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);
}
publicclassBackgroundTestextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
//子Layout要以view的形式加入到主Layout中
privateViewmBarView;
//主Layout的容器加载子Layout的View
privateLinearLayoutmLinearLayout;
//给出关键内容
publicvoidonCreate(BundlesavedInstanceState){
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类:
viewplaincopytoclipboardprint?
publicclassMenuLandscapeLinearLayoutextendsLinearLayout{
//构造函数
publicMenuLandscapeLinearLayout(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
//加载需要的属性,加载方法一的子Layout
((Activity)getContext()).getLayoutInflater().inflate(R.layout.main2,this);
//在此你可以封装很多方法
}
}
publicclassMenuLandscapeLinearLayoutextendsLinearLayout{
//构造函数
publicMenuLandscapeLinearLayout(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
//加载需要的属性,加载方法一的子Layout
((Activity)getContext()).getLayoutInflater().inflate(R.layout.main2,this);
//在此你可以封装很多方法
}
}
最后在程序中动态实例化并加载即可:
viewplaincopytoclipboardprint?
publicclassBackgroundTestextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
privateLinearLayoutmLinearLayout;
//声明一个子LayoutView对象
privateMenuLandscapeLinearLayoutmMenuLandscapeLinearLayout;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//加载主Layout
setContentView(R.layout.main);
//找到容器
mLinearLayout=(LinearLayout)findViewById(R.id.box);
//实例化一个子View
mMenuLandscapeLinearLayout=newMenuLandscapeLinearLayout(this);
//添加到容器
mLinearLayout.addView(mMenuLandscapeLinearLayout);
}
}
publicclassBackgroundTestextendsActivity{
/**Calledwhentheactivityisfirstcreated.*/
privateLinearLayoutmLinearLayout;
//声明一个子LayoutView对象
privateMenuLandscapeLinearLayoutmMenuLandscapeLinearLayout;
@Override
publicvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//加载主Layout
setContentView(R.layout.main);
//找到容器
mLinearLayout=(LinearLayout)findViewById(R.id.box);
//实例化一个子View
mMenuLandscapeLinearLayout=newMenuLandscapeLinearLayout(this);
//添加到容器
mLinearLayout.addView(mMenuLandscapeLinearLayout);
}
}
至此,完成了动态加载子Layout的两种形式,里面可思考的很多,比如封装常用事件、资源,从而节省代码、节省资源;