在导航栏中将后退按钮更改为向下箭头

Change back button to arrow-down in Navigation Bar

我正在使用 AppCompatDialogFragment 来显示 BottomSheetDialog。单击 Navigation Bar 上的后退按钮可关闭 BottomSheetDialog

我想将 Navigation Bar 上的图标从后退按钮更改为 'arrow-down' 图标。这是默认情况下在显示键盘时完成的,我想为底部复制它 Sheet。

为了清楚起见,这是我所拥有的:

这是我需要的:

请注意后退按钮是 "arrow-down"。

导航栏是一个系统-[​​=36=] 组件,我看不出如何将其外观更改为键盘可见时显示的导航栏。

在android O 中引入了更改图标的概念,但它仍然是通过 3rd 方应用程序。 Custom Navigation Bar 使用 WRITE_SECURE_SETTINGS 更改图标。 在 Android O 中,您可以更改栏的显示,即浅色或深色主题。

解决方案 2 对您的帮助更大。 您可以在具有所需布局的导航栏上创建一个 popup window,即 3 个返回按钮、最近使用的应用程序和主页按钮。通过这种方式,您可以相应地更改后退按钮图标。确保弹出窗口 window 与导航栏的高度相同,然后您可以为主页和最近的应用程序创建自己的功能,在后面 function 您可以关闭 BottomSheetDialog 并删除该弹出窗口 window.

下面是home键和最近应用的代码。对于后退按钮,请使用您自己的图标相应地执行您想要实现的操作。

对于主页按钮。

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 的功能。

用于计算navigationBar的高度

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

希望对您有所帮助。

已经回答了,会在AndroidO中介绍。

对于以前的版本,只有 Android 3.x 或 4.4+ 可以使用 SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION 等标志。但是仍然非常有限,付出很多努力你得到的结果不是很友好甚至有问题。

之所以不可能,是因为这是一个安全问题。应用可能会阻止用户退出应用。

查看这些链接: