我对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 问题:
dialogWindow.setLayout(500,500);
在dialog.show
之后执行。当我将dialogWindow.setLayout(500,500);
放在dialog.show
之前时,我觉得它确实无效。为什么getWindow.setLayout(int width, int height)
;宽度和高度的单位是多少?
ScreenShot 答案 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_PARENT
,WRAP_CONTENT
或精确值。确切的值以像素为单位。
答案 1 :(得分:2)
正如您所看到的,Dialog的宽度和高度等于-1,我不知道原因。
-1
是WindowManager.LayoutParams.width
和WindowManager.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
的致电现在应该会产生预期的结果。
getWindow.setLayout(int width, int height)
宽度和高度的单位是多少?
单位是像素。您还可以使用WRAP_CONTENT
和MATCH_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:minHeight
和android: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;)