在导航栏中将后退按钮更改为向下箭头
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_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/
我正在使用 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_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/