Надеюсь, это поможет.

ользую действительно наивный код, чтобы показать фрагмент диалога нижнего листа:

class LogoutBottomSheetFragment : BottomSheetDialogFragment() {

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.view_image_source_chooser, container, false)
        return view
    }
}

Вот как я назвал этот диалог:

LogoutBottomSheetFragment().show(supportFragmentManager, "logout")

Но я вижу это ужасно на картинке ниже. Как я могу сохранить панель навигации белой (нижняя панель, где находятся кнопки назад / домой)?

Тема приложения, которую я использую:

 <!-- Base application theme. -->
<style name="BaseAppTheme" parent="Theme.AppCompat.Light.NoActionBar">
    <!-- Customize your theme here. -->
</style

<style name="AppTheme" parent="BaseAppTheme">
    <item name="android:windowNoTitle">true</item>
    <item name="windowActionBar">false</item>

    <!-- Main theme colors -->
    <!--   your app branding color for the app bar -->
    <item name="android:colorPrimary">@color/colorPrimary</item>
    <!--   darker variant for the status bar and contextual app bars -->
    <item name="android:colorPrimaryDark">@android:color/white</item>
    <!--   theme UI controls like checkboxes and text fields -->
    <item name="android:colorAccent">@color/charcoal_grey</item>

    <item name="colorControlNormal">@color/charcoal_grey</item>
    <item name="colorControlActivated">@color/charcoal_grey</item>
    <item name="colorControlHighlight">@color/charcoal_grey</item>

    <item name="android:textColorPrimary">@color/charcoal_grey</item>
    <item name="android:textColor">@color/charcoal_grey</item>

    <item name="android:windowBackground">@color/white</item>
</style>

Я также попытался переопределить setupDialog вместо onCreateView, но все же происходит:

    @SuppressLint("RestrictedApi")
override fun setupDialog(dialog: Dialog, style: Int) {
    super.setupDialog(dialog, style)
    val view = View.inflate(context, R.layout. view_image_source_chooser,null)
    dialog.setContentView(view)
}
 oferiko04 дек. 2017 г., 13:10
@KalaBalik обновил мой вопрос
 oferiko04 дек. 2017 г., 13:09
@ JJ86 да, корень активности - это расположение Координатора, хотя я сомневаюсь, что это как-то повлияет на эту проблему, так как это фрагмент диалога.
 azizbekian04 дек. 2017 г., 13:39
Можете ли вы поделитьсяstyles.xmlконкретно темаActivity?
 JJ8604 дек. 2017 г., 11:25
Вы уверены, что он прикреплен к вашемуCoordinatorLayout ?
 kalabalik04 дек. 2017 г., 11:33
Как вы показываете фрагмент?

Ответы на вопрос(6)

У меня такая же проблема. После просмотра висточники Я нашел обходной путь (немного хакерский, но я не нашел альтернативы).

public class YourDialog extends BottomSheetDialogFragment {

    //your code

    @NonNull
    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new FitSystemWindowsBottomSheetDialog(getContext());
    }
}

public class FitSystemWindowsBottomSheetDialog extends BottomSheetDialog {

    public FitSystemWindowsBottomSheetDialog(Context context) {
        super(context);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getWindow() != null && Build.VERSION.SDK_INT >= 21) {
            findViewById(android.support.design.R.id.coordinator).setFitsSystemWindows(false);
            findViewById(android.support.design.R.id.container).setFitsSystemWindows(false);
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS |
                    WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS);
            getWindow().addFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_NAVIGATION);
        }
    }
}

И, наконец, не забудьте добавитьандроид: fitsSystemWindows = "истина" в корне вашего диалогового макета.

Надеюсь, это поможет.

ВBottomSheetDialogFragmentединственное, что нужно сделать, это установить контейнерCoordinatorLayout fitSystemWindows вfalse.

override fun onActivityCreated(savedInstanceState: Bundle?) {
    super.onActivityCreated(savedInstanceState)
    (view!!.parent.parent.parent as View).fitsSystemWindows = false
}
view это ваш макетview.parent такое FrameLayout, содержащий ваше представлениеview.parent.parent этоCoordinatorLayoutview.parent.parent.parent это контейнер дляCoordinatorLayout который имеет свойfitsSystemWindow установлен вtrue по умолчанию.

Это гарантирует, что весьBottomSheetDialogFragment рисуется под панелью навигации. Тогда вы можете установитьfitsSystemWindows к вашим собственным контейнерам соответственно.

Что вам не нужно из других ответов, в частности:

хакерский findViewById со ссылкой на системные идентификаторы, которые могут быть изменены,ссылка наgetWindow() или жеgetDialog(),на панели навигации не должно быть никаких рисований.

Это решение работает сBottomSheetDialogFragment создан сonCreateViewЯ не проверялonCreateDialog.

если вы настаиваете на «полностью белой» панели навигации, вы должны пропустить ее часть.

Обратите внимание, что это решение применимо для Android O (API 26), так как в этой версии были представлены значки темной панели навигации. В старых версиях вы получите белые иконки на белом фоне.

Тебе следует:

Добавлятьandroid:fitsSystemWindows="true" в корне вашего диалогового макета.изменятьWindow вашейDialog должным образом.

Поместите этот код вonStart вашего ребенкаBottomSheetDialogFragment, Если вы используете библиотеку дизайна вместо библиотеки материалов, используйтеandroid.support.design.R.id.container.

@Override
public void onStart() {
    super.onStart();
    if (getDialog() != null && getDialog().getWindow() != null && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        Window window = getDialog().getWindow();
        window.findViewById(com.google.android.material.R.id.container).setFitsSystemWindows(false);
        // dark navigation bar icons
        View decorView = window.getDecorView();
        decorView.setSystemUiVisibility(decorView.getSystemUiVisibility() | View.SYSTEM_UI_FLAG_LIGHT_NAVIGATION_BAR);
    }
}

Результат может выглядеть так:

BottomSheetDialogFragment продолжаетсяDialogFragment, Внутри BottomSheetDialog он создает диалог внутриonCreateDialog

 {

    @Override
    public Dialog onCreateDialog(Bundle savedInstanceState) {
        return new BottomSheetDialog(getContext(), getTheme());
    }

}

Слой dim - это свойство диалога, которое применяется ко всему окну. Только тогда он покроет строку состояния. Если вам нужен тусклый слой без нижних кнопок, то вам придется делать это вручную, показывая слой внутри макета и соответственно меняя цвет строки состояния.

Примените тему для dialogfragment, как указано ниже

class LogoutBottomSheetFragment : BottomSheetDialogFragment() {
    init {
        setStyle(DialogFragment.STYLE_NORMAL,R.style.dialog);
    }

    override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
        val view = inflater.inflate(R.layout.view_image_source_chooser, container, false)
        return view
    }


}

Со стилями как

 <style name="dialog" parent="Base.Theme.AppCompat.Dialog">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:backgroundDimEnabled">false</item>
</style>
 Sangeet Suresh10 дек. 2017 г., 11:42
@azizbekian Проверьте, не исчез ли этот диммер в вашем телефоне, используя стиль, указанный в ответе. У меня нет такого телефона для тестирования
 azizbekian10 дек. 2017 г., 11:03
...then you have to do manually by showing a layer inside layout and changing status bar colour accordingly Как? Разве это не вопрос? Ваш ответ выглядит неполным.

BottomSheetDialogFragment.Я бы предпочел использовать добавление нижнего листа, обернув макет в макете координатора и прикрепив BottomSheetBehaiviour к этому макету.

Вы можете следоватьэто В качестве примера

 oferiko09 дек. 2017 г., 18:55
Я хотел бы получить тусклый эффект без написания этого кода самостоятельно. Это будет моим последним средством, если я не найду решение этой проблемы
 Farmaan Elahi09 дек. 2017 г., 18:58
Это невозможно, поскольку открытие диалогового окна приостанавливает текущее действие, поэтому вы не сможете взаимодействовать с ним.

проблема и я наконец нашел решение, которое не является хакерским или требует большого количества кода.

Этот метод заменил фон окна на LayerDrawable, который состоит из двух элементов: затемнения фона и фона панели навигации.

@RequiresApi(api = Build.VERSION_CODES.M)
private void setWhiteNavigationBar(@NonNull Dialog dialog) {
    Window window = dialog.getWindow();
    if (window != null) {
        DisplayMetrics metrics = new DisplayMetrics();
        window.getWindowManager().getDefaultDisplay().getMetrics(metrics);

        GradientDrawable dimDrawable = new GradientDrawable();
        // ...customize your dim effect here

        GradientDrawable navigationBarDrawable = new GradientDrawable();
        navigationBarDrawable.setShape(GradientDrawable.RECTANGLE);
        navigationBarDrawable.setColor(Color.WHITE);

        Drawable[] layers = {dimDrawable, navigationBarDrawable};

        LayerDrawable windowBackground = new LayerDrawable(layers);
        windowBackground.setLayerInsetTop(1, metrics.heightPixels);

        window.setBackgroundDrawable(windowBackground);
    }
}

Метод "setLayerInsetTop" требует API 23, но это прекрасно, поскольку в Android O были введены темные значки панели навигации (API 26).

Итак, последняя часть решения заключается в том, чтобы вызвать этот метод из нижних листов метода onCreate следующим образом.

@NonNull
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {
    Dialog dialog = super.onCreateDialog(savedInstanceState);

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
        setWhiteNavigationBar(dialog);
    }

    return dialog;
}

Я надеюсь, что это поможет, и, пожалуйста, дайте мне знать, если вы найдете устройство или случай, в котором это решение не работает.

 Denis Schura27 июл. 2018 г., 11:11
Это довольно просто: вы должны переопределить bottomSheetTheme в своей теме приложения и в bottomSheetTheme bottomSheetStyle. В вашем bottomSheetStyle теперь вы можете установить фон для рисования с прямоугольной формой и углами. Вот и все.
 Hemanth S Tobi27 июл. 2018 г., 05:14
Эй, может быть, это не контекст, но вы можете сказать мне, как сделать круглые углы для BottomSheetDialog
 dknchris11 янв. 2019 г., 08:44
Это самый чистый ответ. Кроме того, если вы просто хотите использовать цвет панели навигации действия, вы можете просто использовать navigationBarDrawable.setColor (activity.getWindow (). GetNavigationBarColor ()).

Ваш ответ на вопрос