android 一个layout中有很多个子控件,怎么去获得其中的一个控件

android 一个layout中有很多个子控件,怎么去获得其中的一个控件,第1张

一个layout就是一个容器,你可以放一些子控件,当你要 *** 作子控件的时候,你就需要找对应的子控件,再去 *** 作它( *** 作比如设置字体,颜色,样式等)。

可以通过findViewById()方法 来获取,前提是,你的子控件需要定义一个id,然后在通过该方法来寻找并 *** 作它。

还可以通过findViewWithTag()方法来找到子控件(前提是你第一次找到这个子控件时,并设置一个tag),该方法一般用在activity调用adapter里面填充布局里面的子控件。

                                               自定义view-------onLayout

view类的onLayout()是个空方法

viewGroup的onLayout()是个抽象方法

layou()中的onLayout() 是用来设置viewgroup中子view的位置的 ,而不是用来设置当前view的位置的

/     存储所有的View,按行记录      / 

private List> mAllViews = new ArrayList>()

/      记录每一行的最大高度      /     

private ListmLineHeight = new ArrayList();

@Override

protected void onLayout(boolean changed, int l, int t, int r, int b)

{

mAllViewsclear();

mLineHeightclear();

int width = getWidth();

int lineWidth = 0;        // 记录每一行 每加入一个子view之后的当前行宽

int lineHeight = 0 ;   // 记录每一行 每加入一个子view之后的当前行高(取最大值)

ListlineViews = new ArrayList();

int cCount = getChildCount();

// 遍历所有的孩子         

for (int i = 0; i < cCount; i++)          {             

View child = getChildAt(i); 

MarginLayoutParams lp = (MarginLayoutParams) childgetLayoutParams();       

  int childWidth = childgetMeasuredWidth();            

int childHeight = childgetMeasuredHeight();               

// 如果已经需要换行         

if (childWidth + lpleftMargin + lprightMargin + lineWidth > width)  {       

// 记录这一行所有的View以及最大高度    

mLineHeightadd(lineHeight);

 // 将当前行的childView保存,然后开启新的ArrayList保存下一行的childView                  mAllViewsadd(lineViews);                 

lineWidth = 0;// 重置行宽                 

lineViews = new ArrayList();

}

/

如果不需要换行,则累加

/

lineWidth += childWidth + lpleftMargin + lprightMargin;                                       

lineHeight = Mathmax(lineHeight, childHeight + lptopMargin+ lpbottomMargin);

lineViewsadd(child);

}

// 记录最后一行

mLineHeightadd(lineHeight);

mAllViewsadd(lineViews);

此循环小结

// 获取到所有的子view 以及子view的Marginlayoutparams

//  根据当前子view的宽度左右margin 以及当前行的lineWindth 判断是否换行

// 如果换行 则 将行高加入保存下来  并重置行宽行高以及行集合

// 并将行集合保存到总集合之中

// 如果不换行  则记录下当前行的行宽行高 并将当前view加入行集合

// 遍历完所有的集合之后将行高与行集合分别保存下来

// (因为遍历完所有的子view之后,最后一行肯定是不换行,所以行高和行集合都没有保存)

int left = 0;

int top = 0; 

// 得到总行数

int lineNums = mAllViewssize();

for (int i = 0; i < lineNums; i++)

{

// 每一行的所有的views

lineViews = mAllViewsget(i);

// 当前行的最大高度

lineHeight = mLineHeightget(i);

Loge(TAG, "第" + i + "行 :" + lineViewssize() + " , " + lineViews);

Loge(TAG, "第" + i + "行, :" + lineHeight);

// 遍历当前行所有的View

for (int j = 0; j < lineViewssize(); j++)

{

View child = lineViewsget(j);

if (childgetVisibility() == ViewGONE)

{

continue;

}

MarginLayoutParams lp = (MarginLayoutParams) child

getLayoutParams();

//计算childView的left,top,right,bottom

int lc = left + lpleftMargin;          左                                      

int tc = top + lptopMargin;              上

int rc =lc + childgetMeasuredWidth();    右

int bc = tc + childgetMeasuredHeight();    下

Loge(TAG, child + " , l = " + lc + " , t = " + t + " , r ="

+ rc + " , b = " + bc);

childlayout(lc, tc, rc, bc);

left += childgetMeasuredWidth() + lprightMargin

+ lpleftMargin;

}

left = 0;

top += lineHeight;

}

}

此循环小结

// 之后遍历总集合  得到行集合  然后根据相应的下标获取到每一行的行高

// 遍历行集合  得到每一行的子view  然后获取每个子view的    

// 左上坐标  右下坐标  然后调用子view的layout()

// 获取子view的左坐标  初始left为0  每次计算完之后 将当前view的宽度相加

// 最后设置每个子view的layout()

一个View或ViewGroup中什么什么时候能拿到宽高的值?

width 表示 View 在屏幕上可显示的区域大小;

measuredWidth 表示 View 的实际大小,包括超出屏幕范围外的尺寸;

甚至有这样的公式总结到:

getMeasuredWidth() = visible width + invisible width

getMeasuredWidth() 在执行setMeasuredDimension(一般在onMeasure方法中执行)后才有值;

getWidth()在onLayout方法执行后才有值。

Constructor : 构造方法,View初始化的时候调用,在这里是无法获取其子控件的引用的更加无法获取宽高了

onFinishInflate : 当布局初始化完毕后回调,在这里可以获取所有直接子View的引用,但是无法获取宽高

onMeasure : 当测量控件宽高时回调,当调用了requestLayout()也会回调onMeasure在这里一定可以通过getMeasuredHeight()和getMeasuredWidth()来获取控件的高和宽,但不一定可以通过getHeight()和getWidth()来获取控件宽高,因为getHeight()和getWidth()必须要等onLayout方法回调之后才能确定

onSizeChanged : 当控件的宽高发生变化时回调,和onMeasure一样,一定可以通过getMeasuredHeight()和getMeasuredWidth()来获取控件的高和宽,因为它是在onMeasure方法执行之后和onLayout方法之前回调的

onLayout : 当确定控件的位置时回调,当调用了requestLayout()也会回调onLayout在这里一定可以通过getHeight()和getWidth()获取控件的宽高,同时由于onMeasure方法比onLayout方法先执行,所以在这里也可以通过getMeasuredHeight()和getMeasuredWidth()来获取控件的高和宽

addOnGlobalLayoutListener : 当View的位置确定完后会回调改监听方法,它是紧接着onLayout方法执行而执行的,只要onLayout方法调用了,那么addOnGlobalLayoutListener的监听器就会监听到在这里getMeasuredHeight()和getMeasuredWidth()和getHeight()和getWidth()都可以获取到宽高

onWindowFocusChanged : 当View的焦点发送改变时回调,在这里getMeasuredHeight()和getMeasuredWidth()和getHeight()和getWidth()都可以获取到宽高Activity也可以通过重写该方法来判断当前的焦点是否发送改变了;需要注意的是这里View获取焦点和失去焦点都会回调

(部分内容参考于网络,如有不妥,请联系删除~)

         /// <summary>

        /// 获取已经勾选的节点

        /// </summary>

        /// <returns></returns>

        private string GetCheckNodes()

        {

            string strResult = "";

            TreeNode nodeFather = treeView1Nodes[0];

            foreach (TreeNode node in nodeFatherNodes)

            {

                if (nodeChecked)

                {

                    strResult += nodeText + ",";

                }

            }

            return strResult;

        }

你描述的也不是 很清楚 ,上面的方法是获取第一个根节点下 勾选的子节点的Text,希望对你有所帮助

以上就是关于android 一个layout中有很多个子控件,怎么去获得其中的一个控件全部的内容,包括:android 一个layout中有很多个子控件,怎么去获得其中的一个控件、自定义view之onLayout、Android View何时能拿到宽高的值等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9339646.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存