画面を埋めるダイアログスタイルのアクティビティウィンドウを取得するにはどうすればよいですか?


142

ダイアログのテーマが設定されたアクティビティを使用しており、それをフルスクリーンにしたい。WindowManagerを介してウィンドウを手動で全幅と全高に拡大するなど、あらゆることを試しましたが、何も機能しません。

どうやら、ダイアログウィンドウ(またはダイアログテーマのアクティビティ)は、その内容に従ってのみ展開されますが、それでも常に機能するとは限りません。たとえば、幅と高さがFILL_PARENTに設定されているプログレスバーの円(レイアウトコンテナーも同様)を表示していますが、ダイアログは画面いっぱいに表示されるのではなく、はるかに小さいプログレスバーを囲みます。

ダイアログウィンドウ内に小さなものを表示する方法が必要ですが、コンテンツのサイズを変更せずにフルスクリーンサイズに拡大できますか?


2
興味深い注:レイアウトコンテナーの幅と高さをピクセル単位の実際の値に設定すると、ダイアログはそれに応じてサイズ変更されます。しかし、それをFILL_PARENTに設定すると、そうではありません...
Matthias

本当に?アクティビティがインスタンス化しているレイアウト、fill_parentの高さと幅に設定されている親のRelativeまたはLinearLayoutタグがありますか?ダイアログテーマを使用していくつかのアクティビティを実装しましたが、画面全体を占める問題はありませんでした。
MattC、2009

はい、アクティビティのLinearLayoutは、幅と高さの両方でFILL_PARENTに設定されています。
Matthias

回避策を使用して問題をある程度解決しましたが、これは良い解決策ではないので、質問は開いたままにしておきます。私がしたことは、LinearLayoutをサブクラス化して、レイアウトサイクル中にビューのサイズを決定するonMeasure()メソッドをオーバーライドし、画面の幅と高さに固定することでした。ただし、これは不正解です。これは、メニューバーが占めるスペースを考慮に入れていないため、コンテナは実際には画面に表示されるよりも背が高くなります(目に見えない領域に子供たちが消えるなど、すべての奇妙な副作用があります)スクリーン)。
Matthias

私は正しい解決策を見つけました、以下の私の答えを見てください。
Matthias

回答:


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やこのメソッドではなく、幅を埋めません。爪を食べています。
栄玉

6
そしてそれは:import android.view.ViewGroup.LayoutParams;

11
FILL_PARENTは非推奨になりました。代わりに
MATCH_PARENTを

4
画面全体を埋めるのではなく、両側に小さなパディングがあるようです。
マチャド2015

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サポートライブラリと連携しています。ありがとう。
ムハンマドサキブ2017

これは受け入れられるべき答えです。それを行うための最も適切でクリーンな方法。parent = "@ style / Theme.AppCompat.Light.Dialog"の使用を検討してください
Kirill Karmazin

これはうまくいくようですが、私にはうまくいきません。うーん、なぜかしら。おそらく物事は2014
スコット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

setContentView(..)の下にgetwindow()。setLayout ...行を配置した場合にのみ機能します

ありがとう@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.Light.Dialog」、「Theme.AppCompat.DayNight.Dialog」などの「Theme.AppCompat.Dialog」の子孫を使用する人のための回避策です。私はすべてのアクティビティの拡張としてAppCompatActivityを使用しているため、私自身はAppCompatダイアログを使用する必要があります。受け入れられた回答を使用すると、ダイアログがすべての側面(上、右、下、左)にパディングを持つという問題が発生します。

@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」なので、ここではウィンドウの背景をnullにしています。


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を

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"/>
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.