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

问题描述 投票:26回答:3

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

我想将Navigation Bar上的图标从后退按钮更改为“向下箭头”图标。默认情况下,这是在显示键盘时完成的,我想为底部工作表复制它。

要清楚,这里有我所拥有的:

Current

这就是我需要的:

This is what I want

请注意,后退按钮是“向下箭头”。

导航栏是一个系统ui组件,我没有看到改变它的外观的方式,看起来像键盘可见时显示的导航栏。

android controls navigationbar
3个回答
9
投票

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

解决方案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);

对于Back Button //使用您的图标和关闭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

我希望它有所帮助。


4
投票

正如已经回答的那样,它将在Android O中引入。

对于以前的版本,它只能用于Android 3.x,或4.4+,使用标志为SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION等。但仍然非常有限,投入大量精力,你得到的结果不是很友好甚至是小故障。

原因是因为它不可能,因为它是一个安全问题。应用可能会阻止用户退出应用。

看看这些链接:


0
投票

This article非常清楚地描述了如何在Android Oreo中完成它。

© www.soinside.com 2019 - 2024. All rights reserved.