权重和与平方表
Weight sum and square form
我有 LinearLayout
,其中包含两个带有 layout_weight=1
的 Button
小部件。取决于 Button
文本的长度或屏幕分辨率 我得到矩形形式的按钮 (灰色矩形) 但我需要保持方形 (蓝色方块)。
我试图在 onStart()
方法中更改 LinearLayout
参数的 height
,取决于 Button
的 width
,但是 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
我有 LinearLayout
,其中包含两个带有 layout_weight=1
的 Button
小部件。取决于 Button
文本的长度或屏幕分辨率 我得到矩形形式的按钮 (灰色矩形) 但我需要保持方形 (蓝色方块)。
我试图在 onStart()
方法中更改 LinearLayout
参数的 height
,取决于 Button
的 width
,但是 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