android - DialogFragment 与手势导航冲突

标签 android android-layout

我有一个 Fullscreen Dialogfragment,在屏幕的最底部有一个按钮。在一加 7 Pro 中,当我们触摸“继续”按钮的中下部时,在启用手势导航的情况下,整个 UI 会卡在工具栏之外。导航和一切仍然有效。

enter image description here

此外,当我们单击底部中间部分的按钮时,监听器始终会触发,因此会发生按钮单击,如果我们最小化应用程序并重新打开,一切都会重新开始。

风格:-

<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/

相关文章:

java - 如何修复空光标 - android studio

android - 将 View 添加到 RelativeLayout 会更改其大小

android - 如何在不旋转阴影的情况下旋转 float 操作按钮?

android - 在笔记本电脑上通过 USB 调试 android chrome 会出现 404 页面

java - 网络服务器 : use Service instead of Thread

Android slider 以编程方式

java - 房间数据库强制 OnCreate 回调

Android 应用程序错误 - 重复 ID 0x7f04000f、标记 null 或父 ID 0x0 与 com.google.android.gms.maps.SupportMapFragment 的另一个 fragment

android - 如何设置适合任何屏幕高度的布局?

android - 无法在 xml 布局中实例化自定义 View