为什么Android AlertDialog的宽度和高度= -1

时间:2016-06-16 08:56:43

标签: android alertdialog android-alertdialog

我对AlertDialog有三个问题。首先,我将发布我的代码然后问我的问题。

<LinearLayout
android:id="@+id/l2"
android:layout_width="200dp"
android:layout_height="200dp"
android:background="@android:color/holo_orange_light"
xmlns:android="http://schemas.android.com/apk/res/android">
    <TextView
        android:layout_width="200dp"
        android:layout_height="600dp"
        android:text="Test Test"
        android:textSize="40sp"
        android:background="@android:color/holo_green_light"
        android:textColor="@android:color/black"/>

这是在AlertDialog中显示的视图,在activity_main.xml中,我设置了一个按钮来打开AlertDialog,以下是监听器的代码。

  btn.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null);
            AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setView(view).create();
            WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
            Log.d("TAG", "First lp width and height" + lp.width + "  " + lp.height);
            dialog.show();
            Window dialogWindow = dialog.getWindow();
            dialogWindow.setLayout(500,500);
            WindowManager.LayoutParams lp2 = dialogWindow.getAttributes();
            Log.d("TAG", "lp2 width and height" + lp2.width + "  " + lp2.height);

        }
    });

logcat信息截图如下: Log 问题:

  1. 正如您所看到的,Dialog的宽度和高度等于-1,我不知道 知道原因。
  2. dialogWindow.setLayout(500,500);dialog.show之后执行。当我将dialogWindow.setLayout(500,500);放在dialog.show之前时,我觉得它确实无效。为什么
  3. getWindow.setLayout(int width, int height);宽度和高度的单位是多少? ScreenShot

3 个答案:

答案 0 :(得分:3)

1&amp; 2
在您呼叫.show().create()之前,不会创建alertdialog。因此,如果您在创建之前调用您正在调用的方法,它将只返回一些默认值。

如果你这样做

AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setView(view).create();
dialog.create();
WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
Log.d("TAG", "First lp width and height" + lp.width + "  " + lp.height);

它应该显示正确的值。

第3
与您在xml中输入的值相同。可以是MATCH_PARENTWRAP_CONTENT或精确值。确切的值以像素为单位。

另见the docs for Window

答案 1 :(得分:2)

  

正如您所看到的,Dialog的宽度和高度等于-1,我不知道原因。

-1WindowManager.LayoutParams.widthWindowManager.LayoutParams.height的默认值。

-1也称为MATCH_PARENT,这意味着对话框会尝试占用尽可能多的空间,同时尊重主题属性,例如最大和最小宽度和高度。

  

dialogWindow.setLayout(500,500)dialog.show()之后执行。当我把它放在dialog.show()前面时它确实无效。为什么呢?

dialog.show()dialog.create()之前,AlertDialog尚未安装其内容。它在内部调用PhoneWindow

的以下方法
@Override
public void setContentView(View view) {
    setContentView(view, new ViewGroup.LayoutParams(MATCH_PARENT, MATCH_PARENT));
}

这也应该解释默认值的来源。您对setLayout的致电现在应该会产生预期的结果。

信用:@TimCastelijns

  

getWindow.setLayout(int width, int height)宽度和高度的单位是多少?

单位是像素。您还可以使用WRAP_CONTENTMATCH_PARENT常量。

如果您要使用此方法,请避免对像素进行硬编码,因为在不同的屏幕上,您会获得不同的视觉效果。这些方法可以帮助您:

/** Precise decimal value, use for translation. */
public static float dpToPx(Context context, int dp) {
    return TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, dp, context.getResources().getDisplayMetrics());
}

/** Rounded down value, use for offsets, paddings, margins. */
public static int dpToPxOffset(Context context, int dp) {
    return (int) (dpToPx(context, dp));
}

/** Rounded up value, use for sizes. */
public static int dpToPxSize(Context context, int dp) {
    return (int) (0.5f + dpToPx(context, dp));
}

注意:

以下行被忽略。

android:layout_width="200dp"
android:layout_height="200dp"
在父视图提供的layout_对象上设置

LayoutParams前缀属性。由于没有父母,因此您无法使用LayoutParams。请尝试设置android:minHeightandroid:minWidth

根元素的父视图由通胀参数确定:

LayoutInflater.from(context).inflate(R.layout.popup_window, /*parent*/ null);

答案 2 :(得分:1)

 btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.popup_window, null);
        AlertDialog dialog = new AlertDialog.Builder(MainActivity.this).setView(view).create();
        WindowManager.LayoutParams lp = dialog.getWindow().getAttributes();
        Log.d("TAG", "First lp width and height" + lp.width + "  " + lp.height); <---------
        dialog.show();     <----------- you show the window here, so its size can be calculated. Before this, it doesn't exist. This is why you get -1 -1
        Window dialogWindow = dialog.getWindow();
        dialogWindow.setLayout(500,500);
        WindowManager.LayoutParams lp2 = dialogWindow.getAttributes();
        Log.d("TAG", "lp2 width and height" + lp2.width + "  " + lp2.height);

    }
});

在第一次登录之前尝试使用dialog.show;)