Ответ 1
Попробуйте использовать тот же стиль из своего приложения. Я тестировал простой диалог без фрагмента и отлично работал. Например:
new Dialog(context, R.style.CardDetailsDialogStyle);
У меня есть DialogFragment, который я хочу показать в полноэкранном режиме. Тем не менее, я все же хочу, чтобы StatusBar присутствовал, а аппаратные кнопки внизу. Я также хочу установить фоновый цвет StatusBar (для Lollipop).
Моя проблема в том, что если я устанавливаю следующие флаги в диалоговом окне DialogFragment:
getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
Обе клавиатуры StatusBar и Hardware становятся полупрозрачными, а 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>
Это результат:
Как вы можете видеть, ToolBar распространяется поверх кнопок StatusBar и аппаратных кнопок. Я не знаю, правильно ли я это делаю. Я что-то пропустил?
ИЗМЕНИТЬ
Это то же мнение выглядит, когда я удаляю
getDialog().getWindow().addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS);
Попробуйте использовать тот же стиль из своего приложения. Я тестировал простой диалог без фрагмента и отлично работал. Например:
new Dialog(context, R.style.CardDetailsDialogStyle);
Вы должны установить fitsystemwindows = true. Другой способ - добавить пространство с 0dp и изменить его высоту до 25dp, когда будет показано диалоговое окно.
Чтобы изменить размер пространства, используйте параметры макета, проверьте это сообщение: Как создать RelativeLayout программно с двумя кнопками один поверх другого?
Для тех, кто все еще имеет эту проблему, выполните следующие действия. Это просто решает половину проблемы, которая отправляется, т.е. Черная строка состояния.
Добавьте следующую тему в res/value-v21/style
<style name="DialogTheme" parent="@style/Base.Theme.AppCompat.Light.Dialog">
<item name="android:windowTranslucentStatus">true</item>
</style>
И затем примените стиль в DialogFragment
в onCreate
@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>
В моем случае 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);
}