如何根据其父级的维度来确定Android视图的大小?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

如何根据其父级布局的大小调整视图的大小。例如,我有一个RelativeLayout填满整个屏幕的屏幕,我想要一个子视图,比如说ImageView,占据整个高度,宽度的一半?

我试图重写所有的onMeasureonLayoutonSizeChanged,等我无法得到它的工作。

提问于
用户回答回答于

你可以通过创建一个自定义视图并重写onMeasure()方法来解决这个问题。如果您在xml中始终使用“fill_parent”作为layout_width,那么传递给onMeasusre()方法的widthMeasureSpec参数应该包含父级的宽度:

public class MyCustomView extends TextView {

    public MyCustomView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);

        int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
        int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
        this.setMeasuredDimension(parentWidth / 2, parentHeight);
    }
}   

你的XML看起来像这样:

<LinearLayout 
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
    <view
        class="com.company.MyCustomView"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" />
</LinearLayout>
用户回答回答于

你需要调用setMeasuredDimension(根据onMeasure覆盖的需要),LayoutParams为您的视图提供一个新的视图,然后调用super.onMeasure。请记住,你LayoutParams是从视图的父类型派生的,而不是你视图的类型:

@Override 
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec){
   int parentWidth = MeasureSpec.getSize(widthMeasureSpec);
   int parentHeight = MeasureSpec.getSize(heightMeasureSpec);
   this.setMeasuredDimension(parentWidth/2, parentHeight);
   this.setLayoutParams(new *ParentLayoutType*.LayoutParams(parentWidth/2,parentHeight));
   super.onMeasure(widthMeasureSpec, heightMeasureSpec);
}

扫码关注云+社区