为什么 android 自定义对话框全屏显示
Why is android custom dialog coming fullscreen
我正在尝试创建自定义对话框
Base Layout(我也试过各种修改的布局)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@color/dialogHeaderBackground"
android:gravity="center"
android:minHeight="@dimen/minHeightDialogTitle"
android:text=""
android:textStyle="bold" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/title"
android:layout_marginTop="5dp"
android:text="" />
<LinearLayout
android:id="@+id/loutButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_below="@+id/message"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
<Button
android:id="@+id/btnNeutral"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
<Button
android:id="@+id/btnNegative"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
<Button
android:id="@+id/btnPositive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
</LinearLayout>
</RelativeLayout>
Java代码
Dialog dialog = new Dialog(this);
// Dialog dialog = new Dialog(this,R.style.Theme_Dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
Button btnPositive=(Button) dialog.findViewById(R.id.btnPositive);
Button btnNegative=(Button) dialog.findViewById(R.id.btnNegative);
Button btnNeutral=(Button) dialog.findViewById(R.id.btnNeutral);
TextView txvTitle=(TextView)dialog.findViewById(R.id.title);
TextView txvMessage=(TextView)dialog.findViewById(R.id.message);
...
so on and so forth
我得到以下全屏对话框,这是我不想要的
已经尝试过的解决方案,结果与上面的截图相同
- Styles.xml configuration 1 | Implemented Pastebin code
- Styles.xml configuration 2 | Implemented Pastebin code
- The example provided in Android Dev Guide using AlertDialog.Builder | Implemented Java Code
- None 我的底层布局使用
MATCH_PARENT
高度。正如这个 Stack overflow answer 中所说
- 还尝试根据回答 here | Implemented Java Code in Pastebin
将对话的 window 设置更改为 WRAP_CONTENT
- 还尝试将整个
RelativeLayout
保留在父 LinearLayout
中,请参阅 answer[=81= 中的第 3 条评论]
我唯一能得到像样的对话框是在为 xml 布局指定高度时,像这样 android:layout_height="150dp"
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="150dp" >
指定固定高度时的对话框,
- content/layout 消息变大时会丢失
- 当消息较小时,对话框显示的比需要的大,见下面的确定按钮
不建议将上述(指定固定高度)作为解决方案,因为它效率不高,看起来不那么好,也不是动态的,它是静态的
问题
具体要做什么,外观不错的自定义对话框也可以自定义吗?
如果你能帮我解决这个问题,我愿意悬赏
编辑: 提供赏金以纠正解决方案。
<LinearLayout
android:id="@+id/loutButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_below="@+id/message"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
从上面的代码中删除 android:layout_alignParentBottom="true"
并检查。
从线性布局中删除 android:layout_alignParentBottom="true"
行
您可以在对话框中设置此代码
DisplayMetrics displayMetrics = new DisplayMetrics();
dialog.getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (the width you want to set);
params.height = (the height you want to set);
是的,它发生在 relativelayout 上。
在其googledocs中明确提及。
Note that you cannot have a circular dependency between the size of
the RelativeLayout and the position of its children. For example, you
cannot have a RelativeLayout whose height is set to WRAP_CONTENT and a
child set to ALIGN_PARENT_BOTTOM
当您使用对话框时,您必须根据您的要求使用线性布局。
它绝对会为你工作。
进一步的想法可能不适合你,但我只是提一下以供参考
您可以使用 java 代码制作固定大小的对话框,
或者您可以从布局参数中设置布局边距,以便您可以在不同的屏幕尺寸下保持响应能力。
你也可以做一件事,
获取屏幕大小
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
你可以计算出你的新对话框大小并将其设置为@guobao 的答案
DisplayMetrics displayMetrics = new DisplayMetrics();
dialog.getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (new width);
params.height = (new height);
问我是否需要进一步的说明。
这是我遇到同样问题时的做法。
我扩展了 DialogFragment(来自 support.v4 库)
然后充气:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
final View view = inflater.inflate(R.layout.dialog_whatever, null);
builder.setView(view);
return builder.create();
}
这是布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corners"
android:padding="20dp">
<TextView
android:id="@+id/confirm_dialog_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@color/black"
android:text="@string/are_you_sure_declining_whatever"/>
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:orientation="horizontal">
<Button
android:id="@+id/cancel_action"
android:layout_marginRight="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:text="@string/cancel"
android:textColor="@color/accent_color"/>
<Button
android:id="@+id/confirm_action"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:textColor="@color/accent_color"
android:text="@string/reject"/>
</LinearLayout>
</LinearLayout>
此方法也遵循 Material 设计指南!!
希望对您有所帮助
此致,
pedrovic90
我正在尝试创建自定义对话框
Base Layout(我也试过各种修改的布局)
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentRight="true"
android:layout_alignParentTop="true"
android:background="@color/dialogHeaderBackground"
android:gravity="center"
android:minHeight="@dimen/minHeightDialogTitle"
android:text=""
android:textStyle="bold" />
<TextView
android:id="@+id/message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_below="@+id/title"
android:layout_marginTop="5dp"
android:text="" />
<LinearLayout
android:id="@+id/loutButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_below="@+id/message"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
<Button
android:id="@+id/btnNeutral"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
<Button
android:id="@+id/btnNegative"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
<Button
android:id="@+id/btnPositive"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="" />
</LinearLayout>
</RelativeLayout>
Java代码
Dialog dialog = new Dialog(this);
// Dialog dialog = new Dialog(this,R.style.Theme_Dialog);
dialog.requestWindowFeature(Window.FEATURE_NO_TITLE);
dialog.setContentView(R.layout.custom_dialog);
Button btnPositive=(Button) dialog.findViewById(R.id.btnPositive);
Button btnNegative=(Button) dialog.findViewById(R.id.btnNegative);
Button btnNeutral=(Button) dialog.findViewById(R.id.btnNeutral);
TextView txvTitle=(TextView)dialog.findViewById(R.id.title);
TextView txvMessage=(TextView)dialog.findViewById(R.id.message);
...
so on and so forth
我得到以下全屏对话框,这是我不想要的
已经尝试过的解决方案,结果与上面的截图相同
- Styles.xml configuration 1 | Implemented Pastebin code
- Styles.xml configuration 2 | Implemented Pastebin code
- The example provided in Android Dev Guide using AlertDialog.Builder | Implemented Java Code
- None 我的底层布局使用
MATCH_PARENT
高度。正如这个 Stack overflow answer 中所说
- 还尝试根据回答 here | Implemented Java Code in Pastebin 将对话的 window 设置更改为
- 还尝试将整个
RelativeLayout
保留在父LinearLayout
中,请参阅 answer[=81= 中的第 3 条评论]
WRAP_CONTENT
我唯一能得到像样的对话框是在为 xml 布局指定高度时,像这样 android:layout_height="150dp"
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="150dp" >
指定固定高度时的对话框,
- content/layout 消息变大时会丢失
- 当消息较小时,对话框显示的比需要的大,见下面的确定按钮
不建议将上述(指定固定高度)作为解决方案,因为它效率不高,看起来不那么好,也不是动态的,它是静态的
问题
具体要做什么,外观不错的自定义对话框也可以自定义吗?
如果你能帮我解决这个问题,我愿意悬赏
编辑: 提供赏金以纠正解决方案。
<LinearLayout
android:id="@+id/loutButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_below="@+id/message"
android:layout_centerHorizontal="true"
android:layout_marginTop="5dp"
android:orientation="horizontal" >
从上面的代码中删除 android:layout_alignParentBottom="true"
并检查。
从线性布局中删除 android:layout_alignParentBottom="true"
行
您可以在对话框中设置此代码
DisplayMetrics displayMetrics = new DisplayMetrics();
dialog.getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (the width you want to set);
params.height = (the height you want to set);
是的,它发生在 relativelayout 上。 在其googledocs中明确提及。
Note that you cannot have a circular dependency between the size of the RelativeLayout and the position of its children. For example, you cannot have a RelativeLayout whose height is set to WRAP_CONTENT and a child set to ALIGN_PARENT_BOTTOM
当您使用对话框时,您必须根据您的要求使用线性布局。 它绝对会为你工作。
进一步的想法可能不适合你,但我只是提一下以供参考
您可以使用 java 代码制作固定大小的对话框, 或者您可以从布局参数中设置布局边距,以便您可以在不同的屏幕尺寸下保持响应能力。 你也可以做一件事, 获取屏幕大小
DisplayMetrics metrics = new DisplayMetrics();
getWindowManager().getDefaultDisplay().getMetrics(metrics);
int height = metrics.heightPixels;
int width = metrics.widthPixels;
你可以计算出你的新对话框大小并将其设置为@guobao 的答案
DisplayMetrics displayMetrics = new DisplayMetrics();
dialog.getWindow().getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
WindowManager.LayoutParams params = dialog.getWindow().getAttributes();
params.width = (new width);
params.height = (new height);
问我是否需要进一步的说明。
这是我遇到同样问题时的做法。
我扩展了 DialogFragment(来自 support.v4 库)
然后充气:
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity());
LayoutInflater inflater = getActivity().getLayoutInflater();
final View view = inflater.inflate(R.layout.dialog_whatever, null);
builder.setView(view);
return builder.create();
}
这是布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/rounded_corners"
android:padding="20dp">
<TextView
android:id="@+id/confirm_dialog_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textSize="16sp"
android:textColor="@color/black"
android:text="@string/are_you_sure_declining_whatever"/>
<LinearLayout
android:layout_marginTop="20dp"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|bottom"
android:orientation="horizontal">
<Button
android:id="@+id/cancel_action"
android:layout_marginRight="10dp"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:text="@string/cancel"
android:textColor="@color/accent_color"/>
<Button
android:id="@+id/confirm_action"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:background="@color/transparent"
android:textColor="@color/accent_color"
android:text="@string/reject"/>
</LinearLayout>
</LinearLayout>
此方法也遵循 Material 设计指南!!
希望对您有所帮助
此致,
pedrovic90