布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="wrap_content"android:orientation="vertical"android:layout_height="match_parent"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:id="@+id/linearLayout1"><TextViewandroid:id="@+id/tv_version"android:layout_width="500000dp"android:layout_height="wrap_content"android:text="版本号版本号版本号版本号版版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号版本号本号版本号版本号版本号"android:gravity="left"android:textSize="30sp"/></LinearLayout></LinearLayout>

请问TextView 和 LinearLayout1 最后测出来的宽度是什么?

TextView 是500000dp LinearLayout1 就是你屏幕的宽度。如果1280×800 那么宽度就是800dp

我们看下原因:

首先看LinearLayout 的 onMesaure

@Overrideprotected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {if (mOrientation == VERTICAL) {measureVertical(widthMeasureSpec, heightMeasureSpec);} else {measureHorizontal(widthMeasureSpec, heightMeasureSpec);}}

会走到measureVertical

android.widget.LinearLayout#measureVertical

    void measureVertical(int widthMeasureSpec, int heightMeasureSpec) {mTotalLength = 0;int maxWidth = 0;int childState = 0;int alternativeMaxWidth = 0;int weightedMaxWidth = 0;boolean allFillParent = true;float totalWeight = 0;.......//maxWidth  是所有View 里面最宽的maxWidth += mPaddingLeft + mPaddingRight;// Check against our minimum widthmaxWidth = Math.max(maxWidth, getSuggestedMinimumWidth());setMeasuredDimension(resolveSizeAndState(maxWidth, widthMeasureSpec, childState),heightSizeAndState);if (matchWidth) {forceUniformWidth(count, heightMeasureSpec);}}

可以看到我们会拿到最宽的view 的宽度,然后调用了resolveSizeAndState

android.view.View#resolveSizeAndState

    /*** Utility to reconcile a desired size and state, with constraints imposed* by a MeasureSpec. Will take the desired size, unless a different size* is imposed by the constraints. The returned value is a compound integer,* with the resolved size in the {@link #MEASURED_SIZE_MASK} bits and* optionally the bit {@link #MEASURED_STATE_TOO_SMALL} set if the* resulting size is smaller than the size the view wants to be.** @param size How big the view wants to be.* @param measureSpec Constraints imposed by the parent.* @param childMeasuredState Size information bit mask for the view's*                           children.* @return Size information bit mask as defined by*         {@link #MEASURED_SIZE_MASK} and*         {@link #MEASURED_STATE_TOO_SMALL}.*/public static int resolveSizeAndState(int size, int measureSpec, int childMeasuredState) {final int specMode = MeasureSpec.getMode(measureSpec);final int specSize = MeasureSpec.getSize(measureSpec);final int result;switch (specMode) {case MeasureSpec.AT_MOST:if (specSize < size) {result = specSize | MEASURED_STATE_TOO_SMALL;} else {result = size;}break;case MeasureSpec.EXACTLY:result = specSize;break;case MeasureSpec.UNSPECIFIED:default:result = size;}return result | (childMeasuredState & MEASURED_STATE_MASK);}

可以看到,因为我们LinearLayout1 是wrap_content,所以他的测量模式是AT_MOST,值是800dp,最后测量出来的宽度还是800dp,不过会加一个状态,叫MEASURED_STATE_TOO_SMALL

LinearLayout 里面放入一个超宽的TextView相关推荐

  1. char N2Char(int n)函数:将一个整数转换为字符串,并放入一个字符串中

    //将一个整数转换为字符串,并放入一个字符串中 char N2Char(int n)//一次只能转换一个数 {int i;char c;if ((i = n / 10) != 0)N2Char(i); ...

  2. Flutter一切皆widget但是不要将所有东西放入一个widget

    本文主要介绍Flutter一切皆widget但是不要将所有东西放入一个widget 作为 Flutter 开发人员,我相信您在您的开发生活中至少听说过这句流行的句子:"**一切都是widge ...

  3. 打印1-400以内 能同时被5和9 整数的数将这些数放入一个列表中,再输出这个列表

    import java.util.ArrayList;/*** @author silence* 打印1-400以内 能同时被5和9 整数的数将这些数放入一个列表中,再输出这个列表*/ public ...

  4. 集合练习。学生信息包括学号、姓名、出生日期、性别。把N个学生的信息放入一个集合中。可以根据学号,对学生信息进行检索。并可以根据生日进行排序输出。

    集合练习.学生信息包括学号.姓名.出生日期.性别.把N个学生的信息放入一个集合中.可以根据学号,对学生信息进行检索.并可以根据生日进行排序输出. Student.java package Collec ...

  5. mysql 事务 select_mysql 多个select需要放入一个事务吗?

    第一次写博客,还请大家多多支持 今天同事问了个问题:在多个select的时候,用不用放入同一个事务? 首先先看个例子: publicclassJDBCClient { publicstaticvoid ...

  6. 桌上有一只盘子,每次只能放入一个水果。请用Wait()、Signal()原语实现爸爸、儿子、女儿三个并发进程的同步。

    1.桌上有一只盘子,每次只能放入一个水果.爸爸专向盘中放苹果,妈妈专向盘中放桔子,一个女儿专等吃盘中的苹果,一个儿子专等吃盘中的桔子.试用P,V操作写出他们(4个并发进程)能同步的程序. semaph ...

  7. 设一个学生的信息包括学号、姓名、出生日期和性别等。把n个学生的信息放入一个集合中,可以根据学号对学生信息进行检索,并且可以根据出生日期对学生进行排序输出。

    设一个学生的信息包括学号.姓名.出生日期和性别等.把n个学生的信息放入一个集合中,可以根据学号对学生信息进行检索,并且可以根据出生日期对学生进行排序输出. 要求 对于每个学生的个人信息,可以定义一个类 ...

  8. linux中如何分割字符串数组中,关于bash:linux shell脚本:拆分字符串,将它们放入一个数组中,然后循环遍历它们...

    本问题已经有最佳答案,请猛点这里访问. Possible Duplicate: Split string based on delimiter in Bash? 在bash脚本中,如何使用像;这样的分 ...

  9. C语言一维数组的最大值和最小值依次放入一个新的数组中,依次类推

    #include <stdio.h> #define N 9 void fun(int a[],int n) {     int i,j,max,min,px,pn,t;     for( ...

最新文章

  1. 【怎样写代码】实现对象的复用 -- 享元模式(三):享元模式
  2. python使用matplotlib绘制水平条形图并在条形图上添加实际数值标签实战
  3. 802.11ac/ax (wifi6)中的Beamforming技术介绍
  4. Django 笔记2 -- Django 项目
  5. mysql select union_MySQL SELECT语法(四)UNION语法详解
  6. Server被UDP流量***
  7. HTML笔记一,部分常用的元素与属性
  8. Istio 首次安全评估结果公布
  9. HDU1258 DFS
  10. asp.net缓存-SqlCacheDependency
  11. zabbix node.js mysql_Zabbix添加Node.js监控的方法
  12. oracle可以只装客户端吗,我想在linux下只装oracle客户端行吗?怎么装?
  13. 计网实验(一):IP子网划分
  14. 我的世界启动器怎么更改java_我的世界启动器Java路径怎么设置?
  15. UI设计中,颜色的搭配
  16. 被发哥拉着跪向观众,朱军为何如此惊魂?
  17. java privatekey输出字符串_根据字符串(String)生成公钥(PublicKey)和私钥(PrivateKey)对象...
  18. 域乎X蚂蚁链:打造新购物模式?
  19. 忘了密码?如何查看搜狗浏览器中账号助手中的密码
  20. 穿透内网远程访问群晖NAS

热门文章

  1. flowmap怎么做_Photoshop生成的流动贴图(flowmap)
  2. mysql模糊查询 汉字为何不起作用_mysql中文模糊查询遇到的有关问题,各位救急...
  3. 2.QML组件、图像几何变换和元素定位器
  4. Java渐变进度条_Android ProgressBar自定义图片进度,自定义渐变色进度条
  5. 基于 Express 与 Mongodb 的简易 实现一个多人 blog
  6. 【问题】vs IIS破除文件上传限制最全版
  7. 使用批处理复制并以时间规则重命名文件
  8. 关于element-ui 中使用Notice组件(Message、MessageBox、Notification)所遇到的坑
  9. 【20160924】GOCVHelper MFC增强算法(1)
  10. Java RESTful Web Service实战