android: 靜態XML和動態加載XML混合使用,以及重寫Layout控件
近期對android裏麵控件修改做了很多實驗,由於公司需求很多,不得不重寫很多控件。程序目標無非是:高效、輕巧、清晰、標準化
完成動態加載Layout有兩種方法,依據個人喜好進行選擇:
方法1:靜態主Layout動態加載靜態子Layout
首先構建子Layout:main2
- <?xml version="1.0" encoding="utf-8"?>
- <!--布局可以任意定義,此處拿線性布局舉例,裏麵有2個按鈕元素-->
- <LinearLayout xmlns:android="https://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 version="1.0" encoding="utf-8"?>
- <RelativeLayout xmlns:android="https://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:
- 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類:
- 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);
- //在此你可以封裝很多方法
- }
- }
最後在程序中動態實例化並加載即可:
- 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的兩種形式,裏麵可思考的很多,比如封裝常用事件、資源,從而節省代碼、節省資源;
拋磚引玉,分享經驗,希望能助大家優化自己的程序。
最後更新:2017-04-02 16:48:06