1. 程式人生 > >Android 動態生成佈局 (多層巢狀)

Android 動態生成佈局 (多層巢狀)

前段時間學習了android,瞭解到android主要是使用xml佈局檔案進行佈局的,但是對於一些動態的介面,就需要使用程式碼動態生成佈局。

Android 除了可以載入xml檔案,顯示佈局外,也可以程式碼生成佈局,並通過setContentView(View view)方法顯示佈局。單獨的一層佈局,如一個主佈局加一個控制元件(如Button\imageView等)動態生成程式碼比較簡單,下面只給出示例程式碼:

  1. package com.example.android_dongtaishengcheng;  
  2. import android.os.Bundle;  
  3. import android.app.Activity;  
  4. import android.content.Intent;  
  5. import android.view.Menu;  
  6. import android.view.View;  
  7. import android.widget.Button;  
  8. import android.widget.RelativeLayout;  
  9. import android.widget.Toast;  
  10. import android.widget.RelativeLayout.LayoutParams;  
  11. publicclass MainActivity extends Activity  
  12. {  
  13.     RelativeLayout relativeLayout = null
    ;  
  14.     private Button button;  
  15.     @Override
  16.     protectedvoid onCreate(Bundle savedInstanceState)  
  17.     {  
  18.     super.onCreate(savedInstanceState);  
  19.     relativeLayout = new RelativeLayout(this);  
  20.     LayoutParams params = new LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT,  
  21.         RelativeLayout.LayoutParams.MATCH_PARENT);  
  22.     relativeLayout.setLayoutParams(params);  
  23.     relativeLayout.setBackgroundResource(R.color.back);  
  24.     setContentView(relativeLayout);  
  25.     button = new Button(this);  
  26.     LayoutParams params2 = new LayoutParams(300300);  
  27.     button.setLayoutParams(params2);  
  28.     params2.addRule(RelativeLayout.CENTER_IN_PARENT);  
  29.     button.setText("hello");  
  30.     relativeLayout.addView(button);  
  31.     button.setOnClickListener(new View.OnClickListener()  
  32.     {  
  33.         @Override
  34.         publicvoid onClick(View v)  
  35.         {  
  36.         // TODO Auto-generated method stub
  37.         startActivity(new Intent(MainActivity.this,SecondActivity.class));  
  38.         }  
  39.     });  
  40.     }  
  41. }  
下面進入重點:多層巢狀佈局的動態生成。

情景描述:父佈局是一個線性佈局,其子佈局按豎直方向排列,子佈局的子佈局也是一個線性佈局,按水平方向排列。
其實很簡單,關鍵點在於,如何控制主佈局的子佈局換行顯示,即實現Orientation = "vertical"。可以在子佈局外在加一層佈局,即下面的drawParent()方法,該方法用來生成父佈局的直接子佈局,drawView()方法用來生成直接子佈局的子佈局(該佈局也是多層巢狀)。可以實現如下圖效果:


貼出程式碼如下:

  1. /** 
  2.  *  
  3.  */
  4. package com.example.android_dongtaishengcheng;  
  5. import android.R.integer;  
  6. import android.app.Activity;  
  7. import android.content.Context;  
  8. import android.os.Bundle;  
  9. import android.view.Gravity;  
  10. import android.view.View;  
  11. import android.widget.Button;  
  12. import android.widget.LinearLayout;  
  13. import android.widget.RelativeLayout;  
  14. import android.widget.LinearLayout.LayoutParams;  
  15. /** 
  16.  * @author zhiyuan 
  17.  *  
  18.  * 2014-5-29 上午10:44:44 
  19.  *  
  20.  */
  21. publicclass SecondActivity extends Activity  
  22. {  
  23.     LinearLayout layout = null;  
  24.     LinearLayout line2 = null;  
  25.     LinearLayout line3 = null;  
  26.     LinearLayout line4 = null;  
  27.     @Override
  28.     protectedvoid onCreate(Bundle savedInstanceState)  
  29.     {  
  30.     // TODO Auto-generated method stub
  31.     super.onCreate(savedInstanceState);  
  32.     layout = new LinearLayout(this);  
  33.     LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);  
  34.     layout.setLayoutParams(params);  
  35.     layout.setOrientation(LinearLayout.VERTICAL);  
  36.     setContentView(layout);  
  37.     // layout.addView(drawView(this));
  38.     line2 = (LinearLayout) drawParent(this);  
  39.     line3 = (LinearLayout) drawParent(this);  
  40.     line4 = (LinearLayout) drawParent(this);  
  41.     for (int i = 0; i < 2; i++)  
  42.     {  
  43.         line2.addView(drawView(SecondActivity.this, i));  
  44.     }  
  45.     for (int i = 0; i < 4; i++)  
  46.     {  
  47.         line3.addView(drawView(SecondActivity.this, i));  
  48.     }  
  49.     for(int i = 0; i < 5; i++){  
  50.         line4.addView(drawView(SecondActivity.this, i));  
  51.     }  
  52.     layout.addView(line2);  
  53.     layout.addView(line3);  
  54.     layout.addView(line4);  
  55.     }  
  56.     //生成子佈局的子佈局
  57.     public View drawView(Context context, int count)  
  58.     {  
  59.     LinearLayout layout = new LinearLayout(context);  
  60.     LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,  
  61.         LayoutParams.WRAP_CONTENT, 1);  
  62.     params.gravity = Gravity.CENTER;  
  63.     layout.setOrientation(LinearLayout.HORIZONTAL);  
  64.     layout.setLayoutParams(params);  
  65.     if (count == 1)  
  66.     {  
  67.         layout.setBackgroundResource(R.color.back);  
  68.     }  
  69.     RelativeLayout relativeLayout = new RelativeLayout(context);  
  70.     android.widget.RelativeLayout.LayoutParams params3 = new android.widget.RelativeLayout.LayoutParams(  
  71.         android.widget.RelativeLayout.LayoutParams.MATCH_PARENT,  
  72.         android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT);  
  73.     relativeLayout.setLayoutParams(params3);  
  74.     /* 
  75.      * ImageView imageView = new ImageView(context); LayoutParams params2 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); 
  76.      */
  77.     Button imageView = new Button(context);  
  78.     android.widget.RelativeLayout.LayoutParams params2 = new android.widget.RelativeLayout.LayoutParams(android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT,  
  79.         android.widget.RelativeLayout.LayoutParams.WRAP_CONTENT);  
  80.     //imageView.setGravity(RelativeLayout.CENTER_IN_PARENT);
  81.     imageView.setText("測試");  
  82.     params2.addRule(RelativeLayout.CENTER_IN_PARENT);  
  83.     // imageView.setBackgroundResource(R.drawable.ic_launcher);
  84.     imageView.setLayoutParams(params2);  
  85.     /* 
  86.      * TextView textView = new TextView(context); LayoutParams params3 = new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); textView.setText("測試專用"); 
  87.      * textView.setLayoutParams(params3); 
  88.      */
  89.     relativeLayout.addView(imageView);  
  90.     // layout.addView(textView);
  91.         layout.addView(relativeLayout);  
  92.     return layout;  
  93.     }  
  94.     //生成主佈局的子佈局
  95.     public View drawParent(Context context)  
  96.     {  
  97.     LinearLayout layout = new LinearLayout(context);  
  98.     LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT);  
  99.     // params.gravity = Gravity.CENTER_HORIZONTAL;
  100.     layout.setOrientation(LinearLayout.HORIZONTAL);  
  101.     layout.setLayoutParams(params);  
  102.     return layout;  
  103.     }  
  104. }  

附Demo下載地址:http://download.csdn.net/detail/laoziyueguo3/7423939