android: 静态XML和动态加载XML混合使用,以及重写Layout控件

思捻如枫 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的两种形式,里面可思考的很多,比如封装常用事件、资源,从而节省代码、节省资源;

相关推荐