Dialog中的view.getWidth()不起作用

时间:2012-11-02 14:08:36

标签: android android-view android-dialog

我想创建方形按钮,但因为我无法通过XML获取宽度来将其分配给按钮的高度,所以我是通过Java来实现的。所以我这样做:

View body = inflater.inflate(R.layout.picker_numeric, null);
Button up = (Button) body.findViewById(R.id.picker_numeric_up);
Log.d(TAG, "" + up.getWidth());
int height = up.getWidth();
up.setHeight(height);
........................
AlertDialog.Builder builder = new AlertDialog.Builder(activity)
        .setTitle(title)
        .setView(body)
........................

我使用Log.d确认getWidth()返回0。 谁知道为什么会这样?我没有选择。

编辑: 之后 MKJParekh Simon 说我的代码是这样的:

dialogContent.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/picker_numeric_layout"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:baselineAligned="false"
android:padding="@dimen/padding_small"
android:weightSum="3"
tools:ignore="HardcodedText,UselessParent" >

<LinearLayout
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:layout_weight="1"
    android:orientation="vertical" >

    <Button
        android:id="@+id/picker_numeric_up"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/padding_medium"
        android:layout_marginRight="@dimen/padding_medium"
        android:gravity="center"
        android:text="+" />

    <EditText
        android:id="@+id/picker_numeric_value"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/padding_medium"
        android:layout_marginRight="@dimen/padding_medium"
        android:gravity="center"
        android:inputType="number" />

    <Button
        android:id="@+id/picker_numeric_down"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="@dimen/padding_medium"
        android:layout_marginRight="@dimen/padding_medium"
        android:gravity="center"
        android:text="-" />
</LinearLayout>
</LinearLayout>

对话框创建者类中的方法:

public void equalDimens() {
    up.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
               MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    int height = up.getMeasuredWidth();
    android.util.Log.d("dd", ""+height);
    up.setLayoutParams(new LinearLayout.LayoutParams(height, height));
    down.setLayoutParams(new LinearLayout.LayoutParams(height, height));
}

然后在Activity的类中:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    createMyDialog();
    LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 
    mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
    new ViewTreeObserver.OnGlobalLayoutListener() {
         public void onGlobalLayout() {
            myDialogClass.equalDimens();
         }
    });

    setContentView(mainLayout);
}


没有调用myDialogClass.equalDimens()我得到了这个: enter image description here

调用方法我得到了这个:

enter image description here

2 个答案:

答案 0 :(得分:1)

在获得视图的高度和宽度之前,您需要measure您的视图。

你可以这样做,这里ll2是你的任何视图对象

ll2.measure(
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
        MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));

int height = ll2.getMeasuredHeight();
int width = ll2.getMeasuredWidth();

获得高度和宽度后,您需要将它们设置为,

ll2.setLayoutParams(new LayoutParams(width, height));

答案 1 :(得分:0)

您的视图已经过测量和膨胀,但尚未在onCreate中绘制。

您可以使用(以及其他解决方案):

@Override
public void onWindowFocusChanged(boolean hasFocus) {
    super.onWindowFocusChanged(hasFocus);
    // get width here
}

如果你不能使用它,例如你有从你的活动中产生的对话框,尝试一个全局布局监听器。

public void onCreate(Bundle savedInstanceState)
 {
     super.onCreate(savedInstanceState);

     // inflate your main layout here (use RelativeLayout or whatever your root ViewGroup type is
     LinearLayout mainLayout = (LinearLayout ) this.getLayoutInflater().inflate(R.layout.main, null); 

     // set a global layout listener which will be called when the layout pass is completed and the view is drawn
     mainLayout.getViewTreeObserver().addOnGlobalLayoutListener(
     new ViewTreeObserver.OnGlobalLayoutListener() {
          public void onGlobalLayout() {
               // measure your views here
          }
     }
 );

 setContentView(mainLayout);

}