我有一个 Fullscreen Dialogfragment,在屏幕的最底部有一个按钮。在一加 7 Pro 中,当我们触摸“继续”按钮的中下部时,在启用手势导航的情况下,整个 UI 会卡在工具栏之外。导航和一切仍然有效。
此外,当我们单击底部中间部分的按钮时,监听器始终会触发,因此会发生按钮单击,如果我们最小化应用程序并重新打开,一切都会重新开始。
风格:-
<style name="FullScreenDialogStyle1" parent="AppTheme">
<item name="android:windowLightStatusBar">true</item>
<item name="colorPrimaryDark">@color/pure_white</item>
<item name="android:navigationBarColor">@color/veryDarkBlue
</item>
<!-- Set this to true if you want Full Screen without status bar -->
<item name="android:windowFullscreen">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowIsFloating">false</item>
<!-- This is important! Don't forget to set window background -->
<item name="android:windowBackground">@color/transparent</item>
<!-- Additionally if you want animations when dialog opening -->
<item name="android:windowEnterAnimation">@anim/slide_up</item>
<item name="android:windowExitAnimation">@anim/slide_down</item>
</style>
XML:-
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/pure_white"
android:orientation="vertical">
<com.google.android.material.appbar.AppBarLayout
android:id="@+id/app_bar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/pure_white"
app:layout_constraintBottom_toTopOf="@id/calendar"
app:layout_constraintTop_toTopOf="parent">
<androidx.appcompat.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
app:navigationIcon="@drawable/ic_close_toolbar">
<mobi.hubbler.app.views.SemiBoldTextView
android:id="@+id/toolbar_title"
style="@style/TextAppearance.AppCompat.Widget.ActionBar.Title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textSize="@dimen/hubbler_text_large"
android:text="@string/date_time_select" />
</androidx.appcompat.widget.Toolbar>
</com.google.android.material.appbar.AppBarLayout>
<FrameLayout
android:id="@+id/calendar"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layout_constraintBottom_toTopOf="@id/view"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/app_bar" />
<View
android:id="@+id/view"
android:layout_width="match_parent"
android:layout_height="5dp"
android:background="@color/slot_selection_divider_bg"
app:layout_constraintBottom_toTopOf="@id/guideline6"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/calendar" />
<mobi.hubbler.app.views.BoldTextView
android:id="@+id/timeSlotTitle"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"
android:padding="@dimen/default_spacing_bw_views"
android:text="Time Slot"
android:textColor="@color/black"
app:layout_constraintTop_toBottomOf="@id/guideline6" />
<androidx.constraintlayout.widget.Guideline
android:id="@+id/guideline6"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"
app:layout_constraintGuide_percent="0.6" />
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/time_list"
android:layout_width="match_parent"
android:layout_height="0dp"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@id/timeSlotTitle"
app:layout_constraintBottom_toTopOf="@id/submitButton"
app:spanCount="3"
tools:listitem="@layout/time_select_item" />
<Button
android:id="@+id/submitButton"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@drawable/workflow_action_bg"
android:text="@string/continue_text"
android:textColor="@color/pure_white"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
最佳答案
WindowInsets告诉应用系统 UI 出现在内容之上的位置,以及屏幕的哪些区域系统手势优先于应用内手势。插图由 WindowInsets 类和 WindowInsetsCompat 表示在 Jetpack 中上课.您可以使用 WindowInsetsCompat 在所有 API 级别上获得一致的行为。
系统插入和强制系统插入 以下插图 API 是最常用的插图类型:
系统窗口插图:它们会告诉您系统 UI 在您的应用中的显示位置。我们讨论了如何使用系统插入将控件从系统栏移开。
系统手势插入:它们返回所有手势区域。这些区域中的任何应用内滑动控件都可能意外触发系统手势。
强制手势插入:它们是系统手势插入的子集,不能被覆盖。它们告诉您系统手势的行为始终优先于应用内手势的屏幕区域。
此外,您还可以看到 this文章。
关于android - DialogFragment 与手势导航冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65196195/