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


142

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

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

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


2
有趣的注意:当将布局容器的宽度和高度设置为以像素为单位的实际值时,对话框将相应地调整大小。但是,将其设置为FILL_PARENT时,则不会...
Matthias

真?活动实例化的布局,它是否具有设置为fill_parent的高度和宽度的父级Relative或LinearLayout标签?我已经实现了一些以对话框为主题的活动,而占用整个屏幕从来没有问题。
MattC

是的,活动的宽度和高度都将LinearLayout设置为FILL_PARENT。
Matthias

我通过使用变通办法解决了该问题,但是由于这不是一个好的解决方案,因此我将保留此问题。我要做的是继承LinearLayout的子类并覆盖其onMeasure()方法,该方法负责在布局周期中确定视图的大小,并将其固定在屏幕的宽度和高度上。不过,这是不正确的,因为这没有考虑菜单栏所占用的空间,因此该容器实际上会比屏幕上看起来更高(所有奇怪的副作用,例如孩子消失在屏幕的不可见区域中)屏幕)。
马提亚斯

我找到了正确的解决方案,请参见下面的答案。
马赛厄斯2009年

Answers:


312

我找到了解决方案:

Theme.Dialog设置了样式的活动中,执行以下操作:

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

    setContentView(R.layout.your_layout);

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

请务必在致电Window.setLayout() 后再致电setContentView(),否则将无法正常工作。


5
谢谢,节省了我的时间,我想不通!但是知道为什么我们必须在代码中明确指定,为什么fill_parent不能通过xml进行带有主题对话框的活动?
坐在

3
我的对话框不会填满宽度,不会填满XML,也不会填满此方法。我正在吃指甲。
eitama 2011年

6
它是:import android.view.ViewGroup.LayoutParams;

11
现在已弃用FILL_PARENT,请改用MATCH_PARENT
AlexV

4
它并没有填满整个屏幕,就像在每侧都有一个小的填充。
马查多

66

您可以将此值添加到样式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>

2
最简单的解决方案。它还与appcompat支持库一起使用。谢谢。
穆罕默德·萨奇布

这应该被接受。最正确,最干净的方法。考虑使用parent =“ @ style / Theme.AppCompat.Light.Dialog”
Kirill Karmazin

这似乎应该工作,但对我而言不行。嗯,我想知道为什么。自2014
Scott Biggs,

53

我只想为下面的内容填满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()。setLayout ...行放在setContentView(..)下面时有效

谢谢@Matthias


11

将您的dialog_custom_layout.xml打包RelativeLayout中,而不是其他任何布局中。


1
同样在这里,宽度和高度完全错误,无法解决。将根布局转换为RelativeLayout也解决了我的问题!
SharpMobileCode

8

对于对话框 这可能对某人有用。我希望对话框占据整个屏幕宽度。搜索了很多,但没有发现有用的东西。最后,这对我有用:

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

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


5

对于使用“ 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”,因此在这里我将窗口背景设为空。


2

在最上方的布局中设置最小宽度。

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>

2

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>

然后我们简单地声明Activity为主题MyDialog

<activity
    android:name=".FooActivity"
    android:theme="@style/MyDialog" />

1

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

<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>

AndroidManifest.xml所需活动的文件集主题中:

<activity
        android:name=".CustomDialog"
        ...
        android:theme="@style/MyDialog"/>

仅此而已,无需以编程方式调用方法。


仍然在两侧(顶部,右侧,底部和左侧)显示填充,并且如果我们也需要显示状态栏,则此解决方案将失败
HendraWD

检查stackoverflow.com/a/39590004/3940133如果你有在每边填充
HendraWD

0

在清单文件中定义了我们的活动

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

没有动作栏

<activity android:name=".YourPopUpActivity"
            android:theme="@android:style/Theme.Holo.Dialog.NoActionBar"/>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.