在导航栏中将返回按钮改为向下箭头

26
我正在使用AppCompatDialogFragment来显示BottomSheetDialog。在导航栏上点击返回键会关闭BottomSheetDialog。 我想将导航栏上的图标从后退按钮改为“向下箭头”图标。当键盘出现时,这是默认执行的操作,我希望能够在底部菜单中复制它。 明确一下,这是我目前拥有的:

Current

这是我需要的:

This is what I want

请注意,返回按钮是一个“向下箭头”。
导航栏是系统UI组件,我不知道如何更改其外观以与键盘可见时显示的导航栏相同。

只有在打开键盘时才会显示一个向下箭头。我很好奇你有什么用例?因为如果只是一种愿望,那么你也可以说“我想要一个八边形代替主页按钮”。你想要成为一个坏孩子并打破规则,这意味着用户肯定知道在什么情况下箭头变成箭头向下,并且你想在那里引入激进的变化,显然谷歌不会允许这样做,因为UX应该在整个平台上保持一致。 - azizbekian
3
当我展示一个 BottomDialog 时,我希望显示一个向下的箭头。当点击返回按钮时,BottomDialog 会通过向下滑动消失,因此显示一个向下的箭头而不是传统的返回按钮是有意义的。 - Vlad
@azizbekian API允许您更改返回按钮的行为,因此允许您更改相关联的图标是有意义的。 - ben75
你可能可以将BottomDialog包装在自定义键盘布局中,但你确定为了一个箭头而要承受这种痛苦吗? - artkoenig
将您的活动设置为全屏,并按您想要的方式布置硬件按钮。您甚至可以重构状态栏。 - RonTLV
2个回答

9
在Android O中引入了更改图标的概念,但仍然需要通过第三方应用程序Custom Navigation Bar来使用WRITE_SECURE_SETTINGS更改图标。 在Android O中,您可以更改导航栏的显示,即浅色或深色主题。 Solution 2可能对您更有帮助。 您可以在导航栏上创建一个带有所需布局(即3个按钮“返回”、“最近使用的应用”和“主页”)的popup window。这样,您就可以相应地更改“返回”按钮图标。确保弹出窗口与导航栏具有相同的高度,然后可以为主页和最近使用的应用程序编写自己的功能,在“返回”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的功能。

用于计算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,否则你将无法恢复原始状态。

希望这能帮到你。


我该如何将弹出窗口放置在导航栏之上?我需要将我的应用程序设置为沉浸模式吗? - Vlad
请查看此链接 https://dev59.com/IJLea4cB1Zd3GeqP4qP8#34595261,您将了解如何准确制作它。@Vlad,使用gravity.BOTTOM而不是Gravity.TOP,并使用您自己的颜色而不是透明色。最后,在拥有自定义视图组时,添加这些按钮并在其上添加单击事件。谢谢,希望对您有所帮助,如果有效,请点赞。 - Sahil
您还可以使用BottomNavigationView,并确保它已添加到NavigationBar中,使用上面的评论答案。再次感谢。 - Sahil

4

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

对于之前的版本,只有在Android 3.x或使用标志时才可能实现4.4+,例如SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION等。但仍然非常有限,即使付出很多努力,你得到的结果也不是非常友好甚至会有问题。

无法实现的原因是安全问题。应用程序可能会阻止用户退出应用程序。

请查看以下链接:


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接