動態新增控制元件及將某XML動態加入到Activity顯示
https://blog.csdn.net/harvic880925/article/details/18042183#
本文第二篇:《動態新增綜合佈局---動態新增控制元件及將某XML動態加入到Activity顯示(續)》
一、動態新增控制元件、設定引數
這個難度比較大,放在前面講,用的也比較多,普通情況下,我們會提前把佈局XML寫好,然後對XML中的元素進行設定,但這種方法在有些情況下就顯得不適合,比較聊天應用,比如帖子的回覆情況。針對這些情況,我們要動態根據獲取到的資料增加控制元件或控制元件組的數量,廢話不多說,下面就開整吧,先看個效果圖:
原始XML 動態新增控制元件後
所做的工作:
1、在原有的介面的基礎上新增一個LinearLayout layout;引數設定為:layout_width:wrap_content;layout_height:wrap_content;
對應程式碼:
LinearLayout layout = new LinearLayout(this); // 線性佈局方式 layout.setOrientation(LinearLayout.HORIZONTAL); // layout.setBackgroundColor(0xff00ffff); LinearLayout.LayoutParams LP_MM = new LinearLayout.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.setLayoutParams(LP_MM);
2、新增一個ImageView;引數設定成layout_width:50;layout_height:50;
ImageView imageView= new ImageView(this);
imageView.setBackgroundResource(R.drawable.maomao);
LinearLayout.LayoutParams PARA = new LinearLayout.LayoutParams(50,50);
imageView.setLayoutParams(PARA);
layout.addView(imageView);
3、新增一個TextView;引數設定成layout_width:wrap_content;layout_height:wrap_content;
對應程式碼:
TextView tv = new TextView(this); // 普通聊天對話
tv.setText("我和貓貓是新新增的");
tv.setBackgroundColor(Color.GRAY);
LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams(
LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
tv.setLayoutParams(LP_WW);
layout.addView(tv);
4、獲取當前佈局,即當前main_activity的LinearLayout佈局(這裡有兩種方法)
方法一:(這種方法不需要:setContentView(R.layout.activity_main);)
-
// 獲取需要被新增控制元件的Linear佈局(方法一) final LayoutInflater inflater = LayoutInflater.from(this); LinearLayout lin = (LinearLayout) inflater.inflate( R.layout.activity_main, null).findViewById( R.id.mainLinearLayout);
方法二:
// 獲取需要被新增控制元件的Linear佈局(方法二) setContentView(R.layout.activity_main); final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout);
5、將動態增加的佈局新增到當前佈局中並顯示;
lin.addView(layout); setContentView(lin);
5、新增對新增的ImageView的單擊訊息響應
//向動態新增的imageView,新增點選響應 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "點選了圖片", Toast.LENGTH_SHORT).show(); } });
全部程式碼:
package com.example.try_add_combination_ctrl; /** * 動態增加控制元件組 * @author harvic * @date 2014-1-9 */ import android.os.Bundle; import android.app.Activity; import android.graphics.Color; import android.view.View; import android.view.View.OnClickListener; import android.view.ViewGroup.LayoutParams; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import android.widget.Toast; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // // 獲取需要被新增控制元件的Linear佈局(方法一) // final LayoutInflater inflater = LayoutInflater.from(this); // LinearLayout lin = (LinearLayout) inflater.inflate( // R.layout.activity_main, null).findViewById( // R.id.mainLinearLayout); // 獲取需要被新增控制元件的Linear佈局(方法二) setContentView(R.layout.activity_main); final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout); // 新增一個LinearLayout佈局,設定成layout_width:wrap_content;layout_height:wrap_content; LinearLayout layout = new LinearLayout(this); // 線性佈局方式 layout.setOrientation(LinearLayout.HORIZONTAL); // layout.setBackgroundColor(0xff00ffff); LinearLayout.LayoutParams LP_MM = new LinearLayout.LayoutParams( LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT); layout.setLayoutParams(LP_MM); //新增一個ImageView,設定成layout_width:50;layout_height:50; ImageView imageView = new ImageView(this); imageView.setBackgroundResource(R.drawable.maomao); LinearLayout.LayoutParams PARA = new LinearLayout.LayoutParams(50, 50);// imageView.setLayoutParams(PARA); layout.addView(imageView); //新增一個TextView,設定成layout_width:wrap_content;layout_height:wrap_content; TextView tv = new TextView(this); // 普通聊天對話 tv.setText("我和貓貓是新新增的"); tv.setBackgroundColor(Color.GRAY); LinearLayout.LayoutParams LP_WW = new LinearLayout.LayoutParams( LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); tv.setLayoutParams(LP_WW); layout.addView(tv); //將動態增加的佈局新增到當前佈局中; lin.addView(layout); setContentView(lin); // 向動態新增的imageView,新增點選響應 imageView.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub Toast.makeText(MainActivity.this, "點選了圖片", Toast.LENGTH_SHORT) .show(); } }); } }
原始碼在文章最底部給出
二、將某一XML動態加入到當前Activity顯示
這裡就跟上面的不一樣了,上面的是動態生成的控制元件或控制元件組,但這裡並不是動態生成的,只是將一個寫好的XML在執行時加入到當前Activity的XML中顯示;
先看XML佈局吧
1、原來的XML(activity_main.xml)
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/mainLinearLayout" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" tools:context=".MainActivity" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="#00ff00" android:text="我是原生的,下面的佈局是新增的" android:textSize="16sp" /> </LinearLayout>
2、要增加進去的XML(combination_ctrl.xml)
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/combineCtrl" android:layout_width="fill_parent" android:layout_height="match_parent" android:orientation="horizontal" > <ImageView android:id="@+id/img" android:layout_width="100dip" android:layout_height="100dip" android:layout_margin="10.0dip" android:padding="2.0dip" android:scaleType="fitXY"/> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content"> <TextView android:id="@+id/name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FFFFFF00" android:textSize="22px" /> <TextView android:id="@+id/info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textColor="#FF00FFFF" android:textSize="13px" /> </LinearLayout> </LinearLayout>
看看效果:
原形狀態 增加進去後
全部程式碼
package com.example.try_add_layout_from_xml; /** * 將一個現有的XML程式碼加入到當前的XML中,但由於ID是一定的,所以與在程式碼中新增include效果一樣 * @author harvic * @date 2014-1-9 */ import android.os.Bundle; import android.app.Activity; import android.view.LayoutInflater; import android.view.Menu; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); final LayoutInflater inflater = LayoutInflater.from(this); // 獲取需要被新增控制元件的佈局 final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout); // 獲取需要新增的佈局 LinearLayout layout = (LinearLayout) inflater.inflate( R.layout.combination_ctrl, null).findViewById(R.id.combineCtrl); // 將佈局加入到當前佈局中 lin.addView(layout); ImageView imageView = (ImageView) findViewById(R.id.img); imageView.setBackgroundResource(R.drawable.maomao); TextView TV_info = (TextView) findViewById(R.id.info); TV_info.setText("第一個INOF"); TextView TV_name = (TextView) findViewById(R.id.name); TV_name.setText("第一個NAME"); } }
可見程式碼非常短,而且關鍵程式碼就只有五句,專門列出來
setContentView(R.layout.activity_main); final LayoutInflater inflater = LayoutInflater.from(this); // 獲取需要被新增控制元件的佈局 final LinearLayout lin = (LinearLayout) findViewById(R.id.mainLinearLayout); // 獲取需要新增的佈局 LinearLayout layout = (LinearLayout) inflater.inflate( R.layout.combination_ctrl, null).findViewById(R.id.combineCtrl); // 將佈局加入到當前佈局中 lin.addView(layout);
原始碼在文章最底部
三、相關程式碼設定引數彙總
1、設定margin
LinearLayout.LayoutParams lp = new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); lp.setMargins(10, 20, 30, 40); imageView.setLayoutParams(lp);
2、設定layout_weight:
setLayoutParams(new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT,weight ));
例如:
TextView tv_like = new TextView(this); LinearLayout.LayoutParams LP_LIKE_MW = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.MATCH_PARENT, LinearLayout.LayoutParams.WRAP_CONTENT, 1.0f); tv_like.setGravity(Gravity.CENTER); tv_like.setPadding(0, 8, 0, 8); tv_like.setText("贊(8)"); tv_like.setTextSize(16); layout_sub_Lin.addView(tv_like, LP_LIKE_MW);
上原始碼(兩個例子程式碼混合在一起):http://download.csdn.net/detail/harvic880925/6829633