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

Posted

技术标签:

【中文标题】在导航栏中将后退按钮更改为向下箭头【英文标题】:Change back button to arrow-down in Navigation Bar 【发布时间】:2018-01-25 01:06:15 【问题描述】:

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

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

要清楚,这里有什么:

这就是我需要的:

请注意,返回按钮是“向下箭头”。

导航栏是一个系统用户界面组件,我看不到如何将其外观更改为键盘可见时显示的导航栏。

【问题讨论】:

只有在打开键盘时才会显示向下箭头。我很好奇你有什么用例?因为如果它只是一个愿望,那么你也可以说“我想要一个八角形而不是主页按钮”。你想成为一个坏男孩并打破规则,这意味着用户当然知道在什么情况下箭头会变成向下箭头,并且你想在那里引入根本性的改变,这显然谷歌不会允许这样做,因为 UX 应该是在整个平台上保持一致。 @azizbekian 我想在显示BottomDialog 时显示向下箭头。单击后退按钮时,BottomDialog 会通过向下滑动消失,显示向下箭头而不是经典的后退按钮是有意义的。 @azizbekian API 允许您更改后退按钮的行为,因此允许您更改关联图标是有意义的。 您可以将您的 BottomDialog 包装在自定义键盘布局中,但是您确定,您想要那种痛苦……只是为了一个箭头? 将您的活动设置为full screen,并按照您想要的方式布置硬件按钮。你甚至可以重建状态栏。 【参考方案1】:

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

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

以下是 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

希望对你有帮助。

【讨论】:

如何将popup window 定位在Navigation Bar 之上?我必须将我的应用设置为沉浸式模式吗? ***.com/a/34595261/6761707 选中此选项,您将知道如何准确地制作它@Vlad 而不是 Gravity.TOP 使用 Gravity.BOTTOM 而不是透明您自己的颜色。最后......当让您的 customViewGroup 添加这些按钮并在其上单击事件时。谢谢,如果它对您有用,希望对您有所帮助并进行投票 您也可以使用您的 BottomNavigationView 并确保使用上述评论答案将其添加到 NavgationBar。再次感谢【参考方案2】:

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

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

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

看看这些链接:

Android overlay on top of software buttons Hide System Bar in Tablets http://room-15.github.io/blog/2015/03/17/overlaying-the-system-navigation-bar/

【讨论】:

以上是关于在导航栏中将后退按钮更改为向下箭头的主要内容,如果未能解决你的问题,请参考以下文章

导航栏后退按钮箭头字体 Swift

iOS导航栏:将左栏按钮从菜单更改为后退

更新 SwiftUI 导航栏标题

更改导航栏后退按钮并删除标题以使其看起来像在 ios7 中

如何更改菜单栏中的 Xamarin 后退按钮?

更改导航栏中后退按钮的颜色