为什么 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

我得到以下全屏对话框,这是我不想要的

已经尝试过的解决方案,结果与上面的截图相同

  1. Styles.xml configuration 1 | Implemented Pastebin code
  2. Styles.xml configuration 2 | Implemented Pastebin code
  3. The example provided in Android Dev Guide using AlertDialog.Builder | Implemented Java Code
  4. None 我的底层布局使用 MATCH_PARENT 高度。正如这个 Stack overflow answer
  5. 中所说
  6. 还尝试根据回答 here | Implemented Java Code in Pastebin
  7. 将对话的 window 设置更改为 WRAP_CONTENT
  8. 还尝试将整个 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" >

指定固定高度时的对话框,

  1. content/layout 消息变大时会丢失
  2. 当消息较小时,对话框显示的比需要的大,见下面的确定按钮

不建议将上述(指定固定高度)作为解决方案,因为它效率不高,看起来不那么好,也不是动态的,它是静态的

问题

具体要做什么,外观不错的自定义对话框也可以自定义吗?

如果你能帮我解决这个问题,我愿意悬赏

编辑: 提供赏金以纠正解决方案。

<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