Android addView()方法实际使用和面试手册(二)

Android addView()方法分为以下几个部分
addView()方法简述(一)
addView()方法实际使用和面试手册(二)

本章简介

本章将针对上文提到的addView()的方法进行实例操作,并就可能出现的问题以面试题的方式进行解答。

1 .addView (View child, ViewGroup.LayoutParams params)

这个方法是将第二个参数指定的布局给第一个参数传入的子视图中。

听上去有点拗口,我们先看例子,然后再解析

//1
RelativeLayout mRelativeLayout= findViewById(R.id.rl_base);
//2
RelativeLayout.LayoutParams layoutParams = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM);
layoutParams.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
//3
LinearLayout linearLayout = new LinearLayout(this);
linearLayout.setOrientation(LinearLayout.VERTICAL);
TextView textView = new TextView(this);
textView.setText("I love China");
linearLayout.addView(textView);
//4
mRelativeLayout.addView(linearLayout,layoutParams);

看上面这部分代码第一部分获取了一个RelativeLayout。第二部分创建了一个RelativeLayout的LayoutParams并向其中添加了两个规则,一个是在父布局的最右面,一个是再父布局的最底部。第三部分则创建了一个LinearLayout然后向其中添加了一个TextView。第四部分再通过addView (View child, ViewGroup.LayoutParams params)方法吧LinearLayout添加进了RelativeLayout。(注:RelativeLayout的宽和高都是Match_Parent)然后我们来看图

在这里插入图片描述

被添加的LinearLayout确实已经被添加进了RelativeLayout的右下方。我们换一种写法再来看看

linearLayout.setLayoutParams(layoutParams);
mRelativeLayout.addView(linearLayout);

我们把最后一个方法换成了如上的两行代码再来运行看看结果

在这里插入图片描述

一模一样,这样我们就知道了官方描述的意思了。addView (View child, ViewGroup.LayoutParams params)这个方法是将第二个参数赋予了第一个参数然后进行了添加的工作。

这里有的同学就不动了,明明我的ViewGroup是LinearLayout为什么可以set一个RelativeLayout的LayoutParams?看看下面这道面试题。

面试题

1.RelativeLayout的LayoutParams可以赋予LinearLayout吗?LayoutParams是对于谁而言的?

答案:RelativeLayout的LayoutParams是可以赋予LinearLayout的,前提是我们要把LinearLayout作为子View添加进RelativeLayout,否则如果是别的父View添加进去是没有效果的。

LayoutParams是相对于父布局而言的,我们添加给不同View的LayoutParams都要父布局来解析。当然了,获取自身的LayoutParams之后也可以修改自己View的宽高边距等参数,但是这些都是相对的。

2.addView (View child, int index)

这个方法是将传入的子视图放在父布局的指定位置。
一个竖向的LinearLayout,如果你把index指定为-1则每次都会把子视图放在最后一个,也就是一个一个向下叠加,新加入的会放在最后;如果把Index指定为0,新加入的将会在头部把先加入的子视图挤下去,达到在顶部插入视图的效果,以此类推,具体看效果。

LinearLayout

        TextView textView = new TextView(this);
        textView.setText("textView");
        TextView textView1 = new TextView(this);
        textView1.setText("textView1");
        TextView textView2 = new TextView(this);
        textView2.setText("textView2");
        LinearLayout linearLayout1 = new LinearLayout(this);
        linearLayout1.setOrientation(LinearLayout.VERTICAL);
        linearLayout.addView(textView,-1);
        linearLayout.addView(textView1,-1);
        linearLayout.addView(textView2,-1);

我们把index置为-1

在这里插入图片描述

可以看到是按照顺序往下加的,和addView (View child)的效果是一样的;

我们把index置位0

在这里插入图片描述

和我们的预期一致

需要注意的是,index参数的大小不能大于子View的个数,不然会报错。

Caused by: java.lang.IndexOutOfBoundsException: index=1 count=0

如果我们设置的index大于子view的个数会有问题,猜想一下子View是怎么存储的呢?

3.addView (View child, int index,ViewGroup.LayoutParams params)

这个就是前两个的一个结合,不多说了。

4.addView (View child)

需要注意的是,这个会吧父布局的布局信息添加给这个子视图。所以,如果你想这个子视图有自己的布局信息,就要先通过setLayoutParams设置好布局信息再addView。

5.addView (View child, int width, int height)

这个看上去就很容易,通过width和height来指定子视图的宽高。

总结

这篇主要介绍了LayoutParams的使用,学会了这一点就OK了,在日常的使用中就没有大问题了!好啦,addView的文章到这就结束了!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章