权重和与平方表

Weight sum and square form

我有 LinearLayout,其中包含两个带有 layout_weight=1Button 小部件。取决于 Button 文本的长度或屏幕分辨率 我得到矩形形式的按钮 (灰色矩形) 但我需要保持方形 (蓝色方块)

我试图在 onStart() 方法中更改 LinearLayout 参数的 height,取决于 Buttonwidth,但是 getWidth() returns 0。我知道那是因为那一刻的视图还没有渲染。请帮我解决我的问题。

你完全正确,因为那时不会绘制视图,所以你必须使用 viewtreeobserver:

像这样:

        final ViewTreeObserver treeObserver = viewToMesure
                .getViewTreeObserver();

        treeObserver
                .addOnGlobalLayoutListener(new OnGlobalLayoutListener() {

                    @Override
                    public void onGlobalLayout() {
                        // TODO Auto-generated method stub
                        System.out.println(viewToMesure.getHeight()
                                + "SDAFASFASDFas");
                        heith = viewToMesure.getHeight();


                    }
                });

此视图树观察器将在基于您计算的视图创建视图后调用,您可以更改。

您可以使用自定义视图通过重写 onMeasure 将视图的高度设置为与其宽度相同:

public class SquareButton extends Button {

    public SquareButton (Context context) {
        super(context);
    }

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

    public SquareButton (Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

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

您只需在 xml 布局中使用自定义按钮,而无需在 activity:

中执行任何操作
<com.package.name.SquareButton
    android:layout_with="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1" />

有很多方法可以实现这一点。如果你需要找到一个元素的真实宽度,你可以:

1) 附上一个 OnGlobalLayoutListener to the view's ViewTreeObserver(但记得完成后将其删除)

2) 或者您可以手动测量您需要什么:

 if(view.getMeasuredHeight() == 0){
    WindowManager manager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
    DisplayMetrics metrics = new DisplayMetrics();
    manager.getDefaultDisplay().getMetrics(metrics);
    view.measure( metrics.widthPixels, metrics.heightPixels );
 }
 int realHeight = view.getMeasuredHeight();
 //...your code