1

これは、高さと幅の両方に対してmatch_parentを持つDialogFragmentを表示しようとしていますが、その上にDialogFragmentがStatusBarの下に表示されています。ステータスバーの下にDialogFragmentの内容を表示

DialogFragmentは、下、右、左、上にパディングのデフォルト値を適用しています。しかし、上部のパディングは、statusBarからカウントを開始し、合計画面サイズからカウントを開始しません。

DialogFragmentをmatch_parentに設定するにはどうすればよいですか?通常、/デフォルトのパディングは上、下、右、左に設定できますか?

答えて

3

デフォルトでは、Dialogが適用され、FLAG_LAYOUT_IN_SCREENおよびFLAG_LAYOUT_INSET_DECORフラグが適用されます。 PhoneWindowからの抜粋:

 

     mIsFloating = a.getBoolean(R.styleable.Window_windowIsFloating, false); 
     int flagsToUpdate = (FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR) 
       & (~getForcedWindowFlags()); 
     if (mIsFloating) { 
      setLayout(WRAP_CONTENT, WRAP_CONTENT); 
      setFlags(0, flagsToUpdate); 
     } else { 
      setFlags(FLAG_LAYOUT_IN_SCREEN|FLAG_LAYOUT_INSET_DECOR, flagsToUpdate); 
     } 
 

FLAG_LAYOUT_INSET_DECORあなたはを適用する必要はありませんこと、フラグです。 docsから:

ウィンドウフラグ:のみFLAG_LAYOUT_IN_SCREENと組み合わせて使用​​するための特別なオプション。画面にレイアウトをリクエストすると、ステータスバーなどの画面の上または下にウィンドウが表示されることがあります。また、このフラグを含めることで、ウィンドウマネージャは、コンテンツがスクリーン装飾で覆われていないことを保証するために必要な挿入矩形を報告します。このフラグは通常ウィンドウによって設定され、setFlags(int、int)に記載されています。

デフォルトでは、windowIsFloatingが有効です。だから、あなたはあなたのカスタムテーマ宣言した場合:で続い

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar"> 
    ... 
    <item name="android:windowTranslucentStatus">true</item> 
    <item name="android:windowTranslucentNavigation">true</item> 
    <item name="android:windowDrawsSystemBarBackgrounds">true</item> 

</style> 

<style name="MyTheme" parent="@style/ThemeOverlay.AppCompat.Dialog.Alert"> 
    <item name="android:windowBackground">@android:color/transparent</item> 
    <item name="android:colorBackgroundCacheHint">@null</item> 
    <item name="android:windowFrame">@null</item> 
    <item name="android:windowContentOverlay">@null</item> 
    <item name="android:windowAnimationStyle">@null</item> 
    <item name="android:windowIsFloating">false</item> 
    <item name="android:backgroundDimEnabled">false</item> 
    <item name="android:windowIsTranslucent">true</item> 
    <item name="android:windowNoTitle">true</item> 
</style> 

をごDialogFragment

 

    public Dialog onCreateDialog(Bundle savedInstanceState) { 
     Dialog dialog = new Dialog(getActivity(), R.style.MyTheme); 
     dialog.setContentView(R.layout.your_layout); 
     return dialog; 
    } 
 

レイアウト内容は以下の通りです:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical"> 

    <View 
     android:layout_gravity="center_horizontal" 
     android:background="@color/colorAccent" 
     android:layout_width="250dp" 
     android:layout_height="700dp"/> 

</FrameLayout> 

その後、あなたは、この出力が得られます:


あなたはピンクのレイアウトは、ステータスバーの下とナビゲーションバーの上にレイアウトしたい場合は、ちょうどあなたのルートViewGroupandroid:fitsSystemWindows="true"を適用します。

<FrameLayout 
    ... 
    android:fitsSystemWindows="true"> 

    <View .../> 

</FrameLayout> 

はこれが出力されます

私のthis答えでそのフラグの意味を見ることができます。

+0

これをonResume()に追加しても問題は解決しません。今、私は高さと幅をラップするビューを持っています。 – Bugdr0id

+0

'getDialog()。getWindow()。setFlags(...)'を実行していますか? – azizbekian

+0

はい、設定:getDialog()。getWindow()。setFlags(FLAG_LAYOUT_IN_SCREEN、FLAG_LAYOUT_IN_SCREEN); – Bugdr0id

関連する問題