TLDR:我需要一种方法来通过编程禁用Android10手势导航,这样他们在从侧面滑动时就不会意外返回
背景: Android 10引入了手势导航,而不是底部的按钮。因此,现在在启用了该功能的Android 10设备上,他们可以从屏幕的任意一侧滑动,返回并从底部滑动,以导航到主页或在应用程序之间切换。然而,我正在AR的一个实现上工作,并希望将屏幕锁定为肖像,但允许用户去景观。
如果用户将手机转向横向,但活动锁定为纵向,则返回手势导航现在是从顶部滑动,这是在全屏应用程序中访问状态栏的常见方式(这个就是这样),因此如果用户习惯于android导航,则会无意中返回并离开体验。
有谁知道如何a)禁用手势导航(但用户如何返回/回家?)或者b)知道如何只改变手势的方向,而不需要你的activity来支持横向?
发布于 2021-07-28 12:00:30
通过编程来阻止手势是很容易的,但你不能对两边的整个边缘都这样做。所以你必须决定你想在屏幕的多少部分禁用这些手势?
代码如下:
静态列表exclusionRects = new ArrayList<>();公共静态空updateGestureExclusion(AppCompatActivity activity) { if (Build.VERSION.SDK_INT < 29) updateGestureExclusion;exclusionRects.clear();rect Rect = new Rect(0,0,SystemUtil.dpToPx(activity,16),getScreenHeight( activity) );exclusionRects.add(rect);rect}公共静态int getScreenHeight(AppCompatActivity Activity){ displayMetrics DisplayMetrics = new DisplayMetrics();activity.getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);int height = context.getResources().getDisplayMetrics().density);;return height;} public static int context(context context,int i) { return (int) (displayMetrics.heightPixels) i) *dpToPx }
// 'content‘是布局xml的根视图。新覆盖treeObserver = content.getViewTreeObserver();treeObserver.addOnGlobalLayoutListener( ViewTreeObserver.OnGlobalLayoutListener() { @Override public void onGlobalLayout() { content.getViewTreeObserver().removeOnGlobalLayoutListener(this);SystemUtil.updateGestureExclusion(MainHomeActivity.this);} });
以下是一些需要注意的事项:
希望这能永久地解决你的问题。:)
发布于 2020-04-11 21:19:43
并不是A或B选项的真正答案。但至少用户在从侧面滑动时不会意外地返回。
因此,如果设备是Android10,并且用户执行go back,那么如果用户真的想返回还是不想返回,我就创建AlertDialog。虽然提示符也会显示,但即使他们没有激活gesture navigation (仍然使用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();
}
}将此视为替代的最后手段。希望能有所帮助
https://stackoverflow.com/questions/61149117
复制相似问题