Android整理笔记一 1.3动态创建并显示视图

1.3动态创建并显示视图

 1.3.1LayoutParams的运用

1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;

2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。

主要用到的方法:

LayoutParams(宽,高):

   LayoutParams 是ViewGroup的一个内部类,这是一个基类,主要描述了宽高.LayoutParams携带了子控件针对父控件的信息,  告诉父控件如何放置自己


   宽与高有三种指定方式

  • FILL_PARENT (renamed MATCH_PARENT in API Level 8 and higher) 填充父窗体
  • WRAP_CONTENT 包裹内容
  • an exact number 精准描述

每一个ViewGroup(例如LinearLayout, RelativeLayout, CoordinatorLayout, etc)需要存储有关其孩子view的属性信息。它的孩子view被放在ViewGroup,这些位置信息存储在一个包装类viewgroup.layoutparams对象中。
为了包含一个特定的布局的具体参数,viewgroup使用layoutparams Viewgroup类的子类来存储。

  • 每一个继承自ViewGroup的容器比如RelativeLayout等自己对应的LayoutParams,而且这些LayoutParams又有自己独特的属性,比如RelativeLayout.LayoutParams可以设置RelativeLayout.RIGHT
 RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(vgLp);
 params.addRule(RelativeLayout.RIGHT_OF,R.id.mTvBlue);
  • 子控件在获取LayoutParams一定要和当前父控件的容器类型保持一致。
    比如TextView是在LinearLayout下面的,那么LayoutParams就必须是 LinearLayout.LayoutParams。比如上面例子代码中的
LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(textView.getLayoutParams());
textParams.width = dip2px(LikeXmlActivity.this,200);
textParams.height = dip2px(LikeXmlActivity.this,30);
textView.setLayoutParams(textParams);

获取ViewGroup.LayoutParams

getLayoutParams()方法可以获取ViewGroup.LayoutParams对象。但是不能设置

 

关于setLayoutParams报错

不能使用ViewGroup.LayoutParams而必须使用对应父View的LayoutParams类型。如:

某View被LinearLayout包含,则该View的setLayoutParams参数类型必须是LinearLayout.LayoutParams。

原因在于LinearLayout(或其他继承自ViewGroup的layout,如:RelativeLayout)在进行递归布局的时候,LinearLayout会获取子View的LayoutParams,并强制转换成LinearLayout.LayoutParams

高度和宽度是从ViewGroup.MarginLayoutParams.继承而来,因此getLayoutParams() 而ViewGroup.MarginLayoutParams 又是从ViewGroup.LayoutParams继承而来

 

因此两种方式:

要么直接ViewGroup.LayoutParams.设置宽高为WRAP_CONTENT或者FILL_PARENT
要么子view.getLayoutParams() 然后设置具体的宽高

如:在Linearlayout中添加textView

LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(textView.getLayoutParams());//父控件动态设置子控件的宽高
        textParams.width =200;//设置文字宽
        textParams.height = 30;//设置文字高
//或者这样设置
        textParams.height = ViewGroup.LayoutParams.MATCH_PARENT;
		textParams.width = ViewGroup.LayoutParams.MATCH_PARENT;
        //textParams.gravity = Gravity.CENTER;  // 无效,这样并不能让文字在控件里居中
        textView.setLayoutParams(textParams);//利用setLayoutParams方法对控件的layout进行布局更新

如:在linearLayout控件中添加一个textView控件

  首先,创建线性布局对象

LinearLayout layout = new LinearLayout(this);//为本Activity创建一个线性布局对象
//并且设置它的属性 android:layout_width 与 android:layout_height 都为 FILL_PARENT

//布局方面的属性设置方式
LinearLayout.LayoutParams layoutParams =   new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,ViewGroup.LayoutParams.FILL_PARENT);

然后,为本Activity创建一个TextView

TextView textView = new TextView(this);
//然后设置TextView的属性
textView.setText(R.string.hello);
textView.setId(34);

//对于布局方面的属性这样来设置
LinearLayout.LayoutParams textviewParams = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,
      ViewGroup.LayoutParams.WRAP_CONTENT);
//这样直接设置了textview 的宽为FILL_PARENT 高为WRAP_CONTENT

//也可以这样设置   但是通过getLayoutParams()获取textView的getLayoutParams()对象时 textView必须父view.addView()出来


LinearLayout.LayoutParams textParams = new LinearLayout.LayoutParams(textView.getLayoutParams());
        textParams.width = 100;
        textParams.height = 30;


// 高度和宽度是从ViewGroup.MarginLayoutParams.继承而来,因此getLayoutParams() 而ViewGroup.MarginLayoutParams 又是从ViewGroup.LayoutParams继承而来

//因此两种方式
//要么直接ViewGroup.LayoutParams.设置宽高为WRAP_CONTENT或者FILL_PARENT
//要么子view.getLayoutParams() 然后设置具体的宽高

接着在线性布局对象中加入这个TextView

layout.addView(textView,textviewParams);//加入的同时,也就设置了TextView相对于布局对象的布局属性 android:layout_width 与 android:layout_height

最后一步,设置本Activity的顶级界面为线性布局

setContentView(layout,layoutParams); //同时也就设置了布局对象的android:layout_width 与 android:layout_height

 如:在MainActivity中动态设置ImageView的属性

public class MainActivity extends Activity {
 
	private ImageView img;
 
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
 
		initViews();
	}
 
	/**
	 * @方法描述:
	 * @author lizhenya
	 */
	private void initViews() {
		img = (ImageView) findViewById(R.id.img);
		
		LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(
				img.getLayoutParams());
		/**
		 * 高度和宽度是从ViewGroup.MarginLayoutParams继承而来,ViewGroup.MarginLayoutParams的高度和宽度又是
		 * 从ViewGroup.Params继承而来,是基本的属性.
		 */
		params.height = ViewGroup.LayoutParams.MATCH_PARENT;
		params.width = ViewGroup.LayoutParams.MATCH_PARENT;
		/**
		 * margin属性是从ViewGroup.MarginLayoutParams继承而来。
		 */
		params.setMargins(200, 200, 0, 0);
		
		
		
		//LinearLayout.LayoutParams自身的属性
		params.gravity =  Gravity.CENTER;
		params.weight =  (float) 1.0;
		
		img.setLayoutParams(params);
	}
}

加载布局:

setContentView(对象);或者通过addView(对象)加载后  通过setLayoutParams(对象)实现布局更新;

下一章:1.3.2完全自定义视图的绘制

Android 2D绘图(Canvas+paint)详解

猜你喜欢

转载自blog.csdn.net/qq_36408196/article/details/82148571