web-dev-qa-db-ja.com

半透明のステータスバーを備えたフルスクリーンDialogFragment

全画面表示したいDialogFragmentがあります。ただし、StatusBarと、下部にあるハードウェアボタンが必要です。 StatusBar(Lollipop用)の背景色も設定したいと思います。

私の問題は、DialogFragmentに次のフラグを設定した場合です。

getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);   
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);

StatusBarとハードウェアキーボードの両方が半透明になり、DialogFragmentがこれらの後ろに伸びます。

可読性を高めるために大幅に削減されたコードは次のとおりです。

public class CardDetailsDialog extends DialogFragment {

Setup parameters...

public static CardDetailsDialog newInstance(final long cardId, final long projectId){
    CardDetailsDialog frag = new CardDetailsDialog();
    frag.setStyle(DialogFragment.STYLE_NORMAL, R.style.CardDetailsDialogStyle);
    return frag;
}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if(getDialog() != null) {
        getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
        getDialog().getWindow().clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
        getDialog().getWindow().getAttributes().windowAnimations = R.style.DialogSlideAnimation;
        getDialog().getWindow().setLayout(LinearLayout.LayoutParams.MATCH_PARENT,
                LinearLayout.LayoutParams.MATCH_PARENT);
        getDialog().getWindow().setStatusBarColor(Color.RED);
    }
}

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

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    super.onCreateView(inflater, container, savedInstanceState);
    View view = inflater.inflate(R.layout.card_details, container, false);

    Handle everything that happens inside the view...

    return view;
}
}

参照されているテーマは次のとおりです。

<style name="CardDetailsDialogStyle" parent="@style/Theme.AppCompat.Light.Dialog" >
    <item name="Android:windowBackground">@null</item>
    <item name="Android:windowNoTitle">true</item>
    <item name="Android:windowFrame">@null</item>
    <item name="Android:windowIsFloating">true</item>
    <item name="Android:windowContentOverlay">@null</item>
    <item name="Android:windowAnimationStyle">@Android:style/Animation.Dialog</item>
    <item name="Android:windowSoftInputMode">stateUnspecified|adjustPan</item>
</style>

そしてフラグメントのスタイル:

<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:background="@color/pp.whiteBackgroundColor" >

<Android.support.v7.widget.Toolbar xmlns:app="http://schemas.Android.com/apk/res-auto"
    Android:id="@+id/card_details_toolbar"
    Android:layout_height="wrap_content"
    Android:layout_width="match_parent"
    Android:layout_alignParentTop="true"
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
    app:popupTheme="@style/PopupMenutheme">
</Android.support.v7.widget.Toolbar>

    <ScrollView
        Android:id="@+id/details_scrollview"
        Android:layout_height="wrap_content"
        Android:layout_width="match_parent">

        All subview elements here...

    </ScrollView>

</RelativeLayout>

これが結果です: Screenshot

ご覧のように、ToolBarはStatusBarボタンとハードウェアボタンにまたがっています。私がこれに正しく取り組んでいるかどうかはわかりません。何か不足していますか?

[〜#〜]編集[〜#〜]

これは、削除したときの同じビューの外観です。

getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);

enter image description here

17
pnit

アプリから同じスタイルを使用してみてください。私はフラグメントのない単純なダイアログでテストし、問題なく動作しました。そのように:

new Dialog(context, R.style.CardDetailsDialogStyle);
6
tiagotoxa

私の場合 SYSTEM_UI_FLAG_LAYOUT_STABLEオーバーラップの問題を解決

        int width = ViewGroup.LayoutParams.MATCH_PARENT;

        int height = ViewGroup.LayoutParams.MATCH_PARENT;

        dialog.getWindow().setLayout(width,height);

        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Lollipop) {
            dialog.getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
            dialog.getWindow().setStatusBarColor(getResources().getColor(R.color.darkGrayTransp));
            dialog.getWindow().getDecorView().setSystemUiVisibility(SYSTEM_UI_FLAG_LAYOUT_STABLE);//solves issue with statusbar
            dialog.getWindow().setGravity(Gravity.CENTER_HORIZONTAL| Gravity.TOP);
        }
5
adray

この問題が解決しない場合は、次の手順に従ってください。これは、投稿された問題の半分、つまり黒いステータスバーを解決するだけです。

次のテーマをres/value-v21/styleに追加します

<style name="DialogTheme" parent="@style/Base.Theme.AppCompat.Light.Dialog">
     <item name="Android:windowTranslucentStatus">true</item>
</style>

次に、DialogFragmentonCreateにスタイルを適用します

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setStyle(DialogFragment.STYLE_NO_TITLE, R.style.DialogTheme);
}

Editダイアログのテーマに問題がある場合は、このスタイルを使用してください。 colorAccentまたはcolorControlHighlightなど

<style name="DialogTheme" parent="@style/ThemeOverlay.AppCompat.Dialog">
     <item name="Android:windowTranslucentStatus">true</item>
</style>

enter image description here

3
Noman Rafique

Fitsystemwindows = trueに設定する必要があります。他の方法は、ダイアログが表示されるときに0dpのスペースを追加し、その高さを25dpに変更することです。

スペースのサイズを変更するには、レイアウトパラメーターを使用して、この投稿を確認してください: プログラムで2つのボタンを上に重ねてRelativeLayoutを作成する方法

<style name="DialogTheme" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="Android:windowTranslucentStatus">true</item>
        <item name="Android:windowNoTitle">true</item>
        <item name="Android:windowFullscreen">true</item>
        <item name="Android:windowIsFloating">false</item>
    </style>
0
Chhaya