IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> Android 布局 父容器中一个View被另一个View挤出 -> 正文阅读

[移动开发]Android 布局 父容器中一个View被另一个View挤出

问题描述

Gif中意思是蓝色控件将红色控件挤出父容器了, 要求是不让红色控件被挤出父容器而蓝色控件也能自由的向下扩展.

  • 两个View水平,父容器选择LinearLayout.
  • 两个View宽度相加, 小于父容器宽度, 就不做处理. 效果和LinearLayout里一样.
  • 两个View相加宽度大于父容器宽度, 就要重新计算子View的宽度和高度了.下面是具体代码:
public class HotNewsItemView extends LinearLayout {
    public HotNewsItemView(Context context) {
        this(context, null);
    }
    public HotNewsItemView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }
    public HotNewsItemView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        // 获取父容器宽度
        int mParentWidthSize = MeasureSpec.getSize(widthMeasureSpec) - getPaddingLeft() - getPaddingRight();
        // 获取两个子View
        View mContentView = getChildAt(0);
        View mHotTageView = getChildAt(1);
        // 对子View进行测量
        measureChild(mContentView, widthMeasureSpec, heightMeasureSpec);
        measureChild(mHotTageView, widthMeasureSpec, heightMeasureSpec);
        // ContentView宽
        MarginLayoutParams mContentViewMLP = (MarginLayoutParams) mContentView.getLayoutParams();
        int mContentViewWidth = mContentView.getMeasuredWidth() + mContentViewMLP.leftMargin + mContentViewMLP.rightMargin;
        // HotTageView宽
        MarginLayoutParams mHotTageViewMLP = (MarginLayoutParams) mHotTageView.getLayoutParams();
        int mHotTageViewWidth = mHotTageView.getMeasuredWidth() + mHotTageViewMLP.leftMargin + mHotTageViewMLP.rightMargin;

        if (mContentViewWidth + mHotTageViewWidth >= mParentWidthSize) {
            // 如果ContentView宽度加HotTageView宽度大于父容器宽度, 那设置ContentView宽度为父容器宽度减去HotTageView宽度
            int newContentViewhMS = MeasureSpec.makeMeasureSpec(mParentWidthSize - mHotTageViewWidth, MeasureSpec.EXACTLY);
            measureChild(mContentView, newContentViewhMS, heightMeasureSpec);
            // 再获取ContentView的高度, 将该高度设置为父容器的高度
            MarginLayoutParams mAgainContentViewMLP = (MarginLayoutParams) mContentView.getLayoutParams();
            int mContentViewHeight1 = mContentView.getMeasuredHeight() + mAgainContentViewMLP.topMargin + mAgainContentViewMLP.bottomMargin;
            setMeasuredDimension(mParentWidthSize, mContentViewHeight1);
        }
    }
}
    <com.example.myapplication.HotNewsItemView
        android:background="@android:color/darker_gray"
        android:layout_width="80dp"
        android:layout_height="wrap_content"
        android:orientation="horizontal">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text=""
            android:textColor="@color/colorAccent" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="4dp"
            android:text=""
            android:textColor="@color/read" />

    </com.example.myapplication.HotNewsItemView>
  • 关键的API
  1. measureChild(mContentView, widthMeasureSpec, heightMeasureSpec);根据父容器测量规格测量子View宽高
  2. getMeasuredWidth()子View测量后获取子View宽度
  3. setMeasuredDimension(mParentWidthSize, mContentViewHeight1)设置父容器的宽高值
  • 最终效果图
    最终效果图
  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2021-08-06 09:57:05  更:2021-08-06 09:59:10 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年2日历 -2025/2/5 22:58:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码