当前位置: 首页 > 知识库问答 >
问题:

Android 10手势导航禁用

公冶智刚
2023-03-14

TLDR:我需要一种方法编程方式禁用Android 10手势导航,这样他们从侧面滑动时不会意外返回

背景:Android 10引入了手势导航,而不是底部的按钮。因此,现在在Android 10设备上启用了它,他们可以从屏幕的任一侧滑动返回,从底部滑动导航回家或在应用程序之间。然而,我正在AR中开发一个实现,希望将屏幕锁定为纵向,但允许用户浏览横向。

如果用户将手机切换到横向,但活动锁定为纵向,则背面手势导航现在是从顶部滑动,这是访问全屏应用程序(本应用程序就是这样)中状态栏的常见方式,因此,如果用户习惯了Android导航,则会不经意地返回并留下体验。

有人知道如何a)禁用手势导航(但用户如何返回/回家?)对于Android 10,通过编程或b)知道如何只改变手势的方向,而不需要您的活动来支持横向?

共有3个答案

锺离马鲁
2023-03-14

不是对选项AB的真正回答。但至少用户在从侧面滑动时不会意外返回。

因此,如果设备是Android10,用户执行返回,如果用户真的想不想返回,我会发出警报对话框。虽然也会显示提示,但即使它们没有激活手势导航(仍使用2或3个按钮导航)。

@Override
public void onBackPressed() {
    if(android.os.Build.VERSION.SDK_INT >= 29) { //as long as the Device is Android 10 (API level 29) 
        // idk, need more condition like gestureNavigation.isActive()
        AlertDialog.Builder builder = new AlertDialog.Builder(YourActivity.this);


        builder
            .setMessage("Are you sure want to exit?")
            .setPositiveButton("Yes, let me out",  new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog,int id) {
                    YourActivity.super.onBackPressed();
                }
            })
            .setNegativeButton("No, wrong swipe/click", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int id) {
                    dialog.cancel();
                }
            })
            .show();
    } else {
        super.onBackPressed();
    }
}

把这当做最后的选择希望有用

敖涵容
2023-03-14

记得:

  • 必须在doOnLayout()中为您的视图调用SetSystemGestureExclutions()

我的实施:

    binding.root.apply { // changing gesture rects for root view
        
        doOnLayout {
            // updating exclusion rect
            val rects = mutableListOf<Rect>()
            rects.add(Rect(0,0,width,(150 * resources.displayMetrics.density).toInt()))
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
                systemGestureExclusionRects = rects
            }
        }
        
    }
  • 我从顶部排除了150dp的手势,并排除了整个宽度(只是为了测试)

虽然@Dev4Life的回答很有帮助,但我在访问文档之前没有成功:

Android文档:SetSystemGestureExclutions

陈坚
2023-03-14

通过编程很容易阻止手势,但不能对两侧的整个边缘都这样做。所以你必须决定要在屏幕上禁用多少手势?

代码如下:

>

  • 在Utils类中定义此代码。

     static List<Rect> exclusionRects = new ArrayList<>();
    
     public static void updateGestureExclusion(AppCompatActivity activity) {
     if (Build.VERSION.SDK_INT < 29) return;
     exclusionRects.clear();
     Rect rect = new Rect(0, 0, SystemUtil.dpToPx(activity, 16), getScreenHeight(activity));
     exclusionRects.add(rect);
    
     activity.findViewById(android.R.id.content).setSystemGestureExclusionRects(exclusionRects);
     }
    
    public static int getScreenHeight(AppCompatActivity activity) {
     DisplayMetrics displayMetrics = new DisplayMetrics();
     activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
     int height = displayMetrics.heightPixels;
     return height;
    }
    
     public static int dpToPx(Context context, int i) {
     return (int) (((float) i) * context.getResources().getDisplayMetrics().density);
    }
    

    检查您的布局是否在要排除边缘网格的活动中设置,然后应用此代码。

     // 'content' is the root view of your layout xml.
     ViewTreeObserver treeObserver = content.getViewTreeObserver();
     treeObserver.addOnGlobalLayoutListener(new 
     ViewTreeObserver.OnGlobalLayoutListener() {
       @Override
       public void onGlobalLayout() {
           content.getViewTreeObserver().removeOnGlobalLayoutListener(this);
           SystemUtil.updateGestureExclusion(MainHomeActivity.this);
       }
     });
    

    我们将排除矩形宽度添加到16dp以获取返回手势,您可以根据自己的偏好进行更改。

    以下是需要注意的事项:-

    • 你不能阻止两边的手势。如果你这么做,那将是最糟糕的用户体验

    希望这能永久解决您的问题。:)

  •  类似资料:
    • 我一直在遵循谷歌的导航抽屉指南,我想把它添加到一个带有标签和手势的活动中。 我想禁用打开导航抽屉的手势,有人知道怎么做吗?

    • 有没有办法禁用滑动手势来打开导航抽屉?在标签之间滑动时出现菜单真的很烦人。

    • 问题内容: 在这里四处寻找了一段时间,但似乎找不到有效的解决方案。 我试图在Swift中禁用滑动以返回到上一个视图手势。 我尝试了多种解决方案,包括: 和 是否有执行此操作的新方法或其他可行的方法? 问题答案: 您可以禁用它,但是不建议这样做,因为大多数iOS用户通过滑动来回退,而通过按后退按钮可以减少回退。如果要禁用它,则使用a 代替推送转移(不是很大的转移)更为合理。如果您真的想摆脱滑动返回功

    • 我正在寻找禁用特定页面的手势。我遇到了许多帖子,建议将MasterDetailPage的设置为false以禁用它。这有效,但出于某种原因并不总是如此。 目前我只想在登录页面禁用手势,所以在身份验证时我启用手势,在出现时我禁用。 我遇到的问题是,如果用户切换应用程序并返回并退出,手势仍然启用。这让我认为正在触发不同的MasterDetailePage上下文。 有没有人遇到过这个问题,或者对我有什么指

    • 在垂直导航中,如果存在多个分级,常常使用手风琴导航,它会以手风琴方式展开和折叠,来节约空间。 简单的说,手风琴导航就是垂直导航的层层嵌套,需要多少级,就嵌套多少层。这里就以两级导航为例,来介绍手风琴导航的基本制作方法。 为了方便控制手风琴导航的样式和行为,外层导航使用定义列表 dl、而内层使用无序列表 ul 来包裹导航中的链接元素: <dl class="accordion">     <dt>

    • Weex 封装了原生的触摸事件以提供手势系统。使用手势类似于在 Weex 中使用事件,只需在节点上监听手势即可。 手势类型 目前,仅支持以下四种手势类型: touch: 当触摸到一个点,移动或从触摸面移开时触发 touch 手势。触摸手势很精准,它会返回所有详细的事件信息。所以,监听 touch 手势可能很慢,即使只移动一丁点也需要处理大量事件。有三种类型的 touch 手势: type 描述 t