Подтвердить что ты не робот

Сменить кнопку "Назад" на стрелку вниз в панели навигации

Я использую AppCompatDialogFragment для отображения BottomSheetDialog. Нажатие кнопки "Назад" на Navigation Bar закрывает BottomSheetDialog.

Я хочу изменить значок на Navigation Bar с помощью кнопки "Назад" на значок "стрелка вниз". Это делается по умолчанию, когда отображается клавиатура, и я хочу воспроизвести ее для нижнего листа.

Чтобы быть ясным, вот что у меня есть:

Текущий

И вот что мне нужно:

Это то, что я хочу

Обратите внимание, что кнопка "Назад" - "стрелка вниз".

Навигационная панель является компонентом system-ui, и я не вижу способа изменить ее внешний вид, чтобы выглядеть как панель навигации, отображаемая при видимости клавиатуры.

4b9b3361

Ответ 1

В android O введена концепция изменения значка, но она по-прежнему поддерживается сторонним приложением. Пользовательская панель навигации, которая использует WRITE_SECURE_SETTINGS для изменения значков. В Android O вы можете изменить отображение панели i.e Light или Dark theme.

Решение 2 может помочь вам. Вы можете создать popup window на панели навигации с нужным расположением, а также 3 кнопки назад, последние приложения и домашнюю кнопку. Таким образом, вы можете соответствующим образом изменить значок кнопки "Назад" . Убедитесь, что всплывающее окно имеет ту же высоту, что и панель навигации, и вы можете сделать свои собственные функции для домашних и последних приложений, а в обратном function вы можете закрыть свой BottomSheetDialog и удалить это всплывающее окно.

Ниже приведен код для домашнего ключа, а также последних приложений. Для кнопки "Назад" выполните соответственно то, что вы хотите достичь, со своим собственным значком.

Для кнопки "Главная".

Intent startMain = new Intent(Intent.ACTION_MAIN);
startMain.addCategory(Intent.CATEGORY_HOME);
startMain.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(startMain);

Для последних приложений.

Class serviceManagerClass = Class.forName("android.os.ServiceManager");
Method getService = serviceManagerClass.getMethod("getService", String.class);
IBinder retbinder = (IBinder) getService.invoke(serviceManagerClass, "statusbar");
Class statusBarClass = Class.forName(retbinder.getInterfaceDescriptor());
Object statusBarObject = statusBarClass.getClasses()[0].getMethod("asInterface", IBinder.class).invoke(null, new Object[] { retbinder });
Method clearAll = statusBarClass.getMethod("toggleRecentApps");
clearAll.setAccessible(true);
clearAll.invoke(statusBarObject);

Для кнопки "Назад" // используем ваш значок и функцию закрытия BottomSheetDialog.

Для расчета высоты навигационной панели

public static int getSoftButtonsBarSizePort(Activity activity) {
    // getRealMetrics is only available with API 17 and +
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
        DisplayMetrics metrics = new DisplayMetrics();
        activity.getWindowManager().getDefaultDisplay().getMetrics(metrics);
        int usableHeight = metrics.heightPixels;
        activity.getWindowManager().getDefaultDisplay().getRealMetrics(metrics);
        int realHeight = metrics.heightPixels;
        if (realHeight > usableHeight)
            return realHeight - usableHeight;
        else
            return 0;
    }
    return 0;
}

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

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

Ответ 2

Как уже было сказано, он будет представлен в Android O.

Для предыдущих версий это возможно только для Android 3.x или 4.4+ с использованием флагов SYSTEM_UI_FLAG_IMMERSIVE, SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN, SYSTEM_UI_FLAG_HIDE_NAVIGATION и т.д. Но все же очень ограничено, приложив много усилий, вы получите результат не очень дружелюбный или даже глючный.

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

Посмотрите на эти ссылки:

Ответ 3

В этой статье очень хорошо описывается, как это можно сделать в Android Oreo.