首页 文章

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

提问于
浏览
24

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

我想将 Navigation Bar 上的图标从后退按钮更改为'arrow-down'图标 . 默认情况下,这是在显示键盘时完成的,我想为底部工作表复制它 .

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

Current

这就是我需要的:

This is what I want

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

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

3 回答

  • 4

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

    Solution 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的功能 .

    用于计算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 .

    我希望它有所帮助 .

  • 0

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

    对于以前的版本,它只能用于Android 3.x,或4.4使用标志为 SYSTEM_UI_FLAG_IMMERSIVESYSTEM_UI_FLAG_LAYOUT_FULLSCREENSYSTEM_UI_FLAG_HIDE_NAVIGATION 等 . 但仍然非常有限,需要花费很多精力才能得到一个不太友好甚至不好的结果 .

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

    看看这些链接:

  • 9

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

相关问题