Android 如何获得对话框样式的活动窗口来填充屏幕?

Android 如何获得对话框样式的活动窗口来填充屏幕?,android,user-interface,dialog,Android,User Interface,Dialog,我正在使用一个对话框主题集的活动,我希望它是全屏的。我尝试了各种方法,甚至通过WindowManager手动将窗口扩展到全宽和全高,但没有任何效果 显然,对话框窗口(或具有对话框主题的活动)只会根据其内容进行扩展,但即使这样也不总是有效的。例如,我显示了一个进度条圆圈,其宽度和高度设置为填充父对象(其布局容器也是如此),但对话框仍然围绕着小得多的进度条,而不是填充屏幕 必须有一种方法可以在对话框窗口中显示一些小的内容,但可以将其扩展到全屏大小,而不必调整其内容大小?我找到了解决方案: 在设置了主

我正在使用一个对话框主题集的活动,我希望它是全屏的。我尝试了各种方法,甚至通过WindowManager手动将窗口扩展到全宽和全高,但没有任何效果

显然,对话框窗口(或具有对话框主题的活动)只会根据其内容进行扩展,但即使这样也不总是有效的。例如,我显示了一个进度条圆圈,其宽度和高度设置为填充父对象(其布局容器也是如此),但对话框仍然围绕着小得多的进度条,而不是填充屏幕

必须有一种方法可以在对话框窗口中显示一些小的内容,但可以将其扩展到全屏大小,而不必调整其内容大小?

我找到了解决方案:

在设置了
主题对话框
样式的活动中,执行以下操作:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}

在调用
setContentView()
之后调用
Window.setLayout()
非常重要,否则它将无法工作。

在最顶部的布局设置最小宽度

android:minWidth="300dp"
例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"
  xmlns:android="http://schemas.android.com/apk/res/android" android:minWidth="300dp">

<!-- Put remaining contents here -->

</LinearLayout>

我只想填满80%的屏幕,因为我喜欢下面这样做

        DisplayMetrics metrics = getResources().getDisplayMetrics();
        int screenWidth = (int) (metrics.widthPixels * 0.80);

        setContentView(R.layout.mylayout);

        getWindow().setLayout(screenWidth, LayoutParams.WRAP_CONTENT); //set below the setContentview
只有当我将getwindow()设置为。。。setContentView下方的行(..)


谢谢@Matthias

您可以将此值添加到您的样式中android:windowMinWidthMajor和android:windowMinWidthMinor

<style name="Theme_Dialog" parent="android:Theme.Holo.Dialog">
    ...
    <item name="android:windowMinWidthMajor">97%</item>
    <item name="android:windowMinWidthMinor">97%</item>
</style>

...
97%
97%

Matthias的答案基本上是正确的,但它仍然没有填满整个屏幕,因为它的每一面都有一个小的填充物(由@Holmes指出)。除了他的代码之外,我们还可以通过扩展Theme.Dialog样式并添加如下属性来解决这个问题

<style name="MyDialog" parent="@android:style/Theme.Dialog">
    <item name="android:windowBackground">@android:color/transparent</item>
    <item name="android:windowNoTitle">true</item>
</style>

用于对话框 这可能对某人有帮助。 我想要一个对话框,以采取全屏幕宽度。搜索了很多,但没有发现有用的东西。最后,这对我起了作用:

mDialog.setContentView(R.layout.my_custom_dialog);
mDialog.getWindow().setBackgroundDrawable(null);

添加此项后,我的对话框将以全屏幕显示。

这将对像我这样的人有所帮助。创建自定义对话框样式:

<style name="MyDialog" parent="Theme.AppCompat.Light.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowFullscreen">true</item>
    <item name="android:windowIsFloating">false</item>
</style>

也就是说,不需要通过编程调用方法

对于那些使用“Theme.AppCompat.Dialog”或任何其他“Theme.AppCompat.Dialog”子代的人来说,这个答案是一个变通方法,比如“Theme.AppCompat.Light.Dialog”、“Theme.AppCompat.DayNight.Dialog”等。 我自己必须使用AppCompat对话框,因为我使用AppCompatActivity作为我所有活动的扩展。如果我们使用公认的答案,则会出现一个问题,即对话框的每一面(顶部、右侧、底部和左侧)都有填充

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.your_layout);

    getWindow().setLayout(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
}
在活动的样式上,添加以下代码

<style name="DialogActivityTheme" parent="Theme.AppCompat.Dialog">
    <item name="windowNoTitle">true</item>
    <item name="android:windowBackground">@null</item>
</style>

真的
@空的

正如您可能注意到的,在我们的对话框中生成填充的问题是“android:windowBackground”,因此,我在这里将窗口背景设置为空。

将您的对话框\u custom\u layout.xml包装到RelativeLayout中,而不是任何其他布局。这对我很有效。

在定义活动的清单文件中

<activity
        android:name=".YourPopUpActivity"
        android:theme="@android:style/Theme.Holo.Dialog" >
    </activity>

无操作栏

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>


有趣的注意:将布局容器的宽度和高度设置为以像素为单位的实际值时,对话框会相应调整大小。但当设置为“填充父对象”时,它不会…真的吗?活动正在实例化的布局是否具有设置为填充父级的高度和宽度的父级相对或线性布局标记?我已经实施了一些带有对话框主题的活动,但在占据整个屏幕时从来没有遇到过问题。是的,该活动设置了一个线性布局,用于填充父对象的宽度和高度。我通过使用变通方法解决了这一问题,但由于这不是一个好的解决方案,我将保留问题。我所做的是将LinearLayout子类化并重写其onMeasure()方法,该方法负责在布局循环期间确定视图的大小,并将其固定到屏幕宽度和高度。但这是不正确的,因为这没有考虑到菜单栏占用的空间,所以容器实际上比屏幕上看起来的要高(所有奇怪的副作用,如儿童在屏幕不可见区域消失)。我找到了正确的解决方案,请参阅下面的答案。谢谢,节省了我的时间,我怎么也想不到这一点!但是你知道为什么我们必须在代码中明确指定,为什么填充父对象不能通过xml为主题对话框的活动填充吗?我的对话框不会填充宽度,不会用xml,也不会用这种方法。我在吃指甲。它是:
import android.view.ViewGroup.LayoutParams
FILL\u PARENT现在已被弃用,请使用MATCH\u PARENT Institude。它并没有填充整个屏幕,就像它的每一面都有一个小的填充。仍然在每一面显示填充(顶部、右侧、底部和左侧),如果我们也需要显示状态栏,则此解决方案将对每一面是否有填充进行故障检查最简单的解决方案。它还与appcompat支持库一起工作。谢谢。这应该是可以接受的答案。这是最恰当、最干净的方法。考虑使用Prime=“@ style /主题。AppCAMP.Load”对话框。嗯,我想知道为什么。自2014年以来,情况可能发生了变化。同样,宽度和高度完全错误,无法确定如何修复。将根布局转换为相对布局也解决了我的问题!
<activity
        android:name=".YourPopUpActivity"
        android:theme="@android:style/Theme.Holo.Dialog" >
    </activity>
<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>