1

我有一个对话框/模态,我需要沿其宽度 match_parent 。但是,它一直在做 wrap_content。任何想法如何纠正这个问题?

这是我的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/my_root"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="#55555555" >

        <Button
            android:id="@+id/dogs"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="#AAAAAA"
            android:clickable="true"
            android:gravity="center"
            android:onClick="onDogsClicked"
            android:text="Dogs" />

        <Button
            android:id="@+id/cats"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="#AAAAAA"
            android:clickable="true"
            android:gravity="center"
            android:onClick="Cats"
            android:text="Cat" />

        <Button
            android:id="@+id/snake"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="#FF0000"
            android:clickable="true"
            android:gravity="center"
            android:onClick="onSnakeClicked"
            android:text="Snake" />

        <Button
            android:id="@+id/sheep"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:background="#AAAAAA"
            android:clickable="true"
            android:gravity="center"
            android:onClick="onSheepClicked"
            android:text="Sheep" />
    </LinearLayout>

</LinearLayout>

这是程序片段

Dialog animalsView;

    public void onAnimalsClicked(View v) {

        LayoutInflater inflater = getLayoutInflater();
        View dialoglayout = inflater.inflate(R.layout.animals_layout,
            (ViewGroup) findViewById(R.id.my_root));

        animalsView = new Dialog(this, R.style.CustomDialog);
        WindowManager.LayoutParams wmlp = animalsView.getWindow()
            .getAttributes();

        wmlp.gravity = Gravity.BOTTOM;
        wmlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        animalsView.getWindow().setAttributes(wmlp);

        animalsView.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        animalsView.setContentView(dialoglayout);
        animalsView.getWindow().setBackgroundDrawable(new ColorDrawable(0));
        animalsView.show();
    }
4

4 回答 4

1

我遇到了同样的问题,但在 XML 中找不到解决方案。但是 .java 文件中有一个解决方案。

    WindowManager.LayoutParams params = animalsView.getWindow().getAttributes();
    params.gravity = Gravity.BOTTOM;
    params.height = 100;
    params.width = android.view.ViewGroup.LayoutParams.MATCH_PARENT;
于 2014-07-07T22:37:09.013 回答
1

尝试这个...

public void onAnimalsClicked(View v) {

    LayoutInflater inflater = getLayoutInflater();
    View dialoglayout = inflater.inflate(R.layout.animals_layout,
        (ViewGroup) findViewById(R.id.my_root));

    animalsView = new Dialog(this, R.style.CustomDialog);

    ........

    animalsView.setContentView(dialoglayout);

    animalsView.getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

    ......

    animalsView.show();
}
于 2015-02-27T05:40:40.460 回答
0

我认为你应该试试这个。当我遇到这个问题时,我正在使用叠加层。希望这对您有所帮助。

 Dialog animalsView;

    public void onAnimalsClicked(View v) {

        LayoutInflater inflater = getLayoutInflater();
        View dialoglayout = inflater.inflate(R.layout.animals_layout,
            (ViewGroup) findViewById(R.id.my_root));

        animalsView = new Dialog(this, R.style.CustomDialog);
        WindowManager.LayoutParams wmlp = new WindowManager.LayoutParams(
                WindowManager.LayoutParams.MATCH_PARENT,
                WindowManager.LayoutParams.MATCH_PARENT, 
                WindowManager.LayoutParams.TYPE_SYSTEM_OVERLAY,
                        WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN,
                PixelFormat.TRANSPARENT);

        wmlp.gravity = Gravity.BOTTOM;
        wmlp.flags &= ~WindowManager.LayoutParams.FLAG_DIM_BEHIND;
        animalsView.getWindow().setAttributes(wmlp);

        animalsView.getWindow().requestFeature(Window.FEATURE_NO_TITLE);
        animalsView.setContentView(dialoglayout);
        animalsView.getWindow().setBackgroundDrawable(new ColorDrawable(0));
        animalsView.show();
    }
于 2015-02-27T13:15:05.557 回答
0

遇到了类似的问题,并浏览了大量有关此问题的 StackOverflow 帖子。

我尝试了所有可能的解决方案(主要以所有可能的方式更改对话框窗口的布局配置),但它们都不起作用。

但是,当比较match_parent有效的对话框的 XML 布局和无效的对话框的 XML 布局时,我终于找到了一种让它工作的奇怪方法:

我必须将layout_height对话框的设置match_parent如下:

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:padding="@dimen/activity_horizontal_margin"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    // ...

</LinearLayout>

我的猜测是,当涉及到对话框时,Android 会尽量保持高度和宽度之间的最小比例。当layout_height设置为 时wrap_content,此比率受高度限制,宽度缩小。但是通过切换到match_parentlayout_height则比率更大并且有界于现在填充整个屏幕的宽度。不确定这是否是正确的解释,但这就是我从这个观察中得出的结论。尽管这是违反直觉的,但这听起来可能是合乎逻辑的......

此外,我尝试了横向和纵向,都在此更改后工作。

最后,请注意,我的 java 代码中没有与窗口配置相关的任何内容:

    final Dialog dialogLayout = new Dialog(mContext);
    dialogLayout.requestWindowFeature(Window.FEATURE_NO_TITLE);
    dialogLayout.setCancelable(false);

    View layout = mContext.getLayoutInflater().inflate(R.layout.popup_dialog_introduce_myself, null);
    dialogLayout.setContentView(layout);
    //  ...
    dialogLayout.show();
于 2018-03-30T20:18:26.407 回答