在导航栏中将后退按钮更改为向下箭头
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_IMMERSIVE
、SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
、SYSTEM_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/【讨论】:
以上是关于在导航栏中将后退按钮更改为向下箭头的主要内容,如果未能解决你的问题,请参考以下文章