簡體   English   中英

當 TextView 錯誤橫幅可見時,RecyclerView 的最后一項被切斷。 我正在使用帶屏障的約束布局

[英]RecyclerView's last item is cut off when TextView Error Banner is visible. I'm using Constraint Layout with Barrier

我不知道如何問這個問題。 這似乎很容易做到,但我不確定為什么它不起作用。 無論如何,這里去。 我有這個錯誤橫幅,只有當類別的總“權重”小於或大於 100 時才應該可見。但是我的問題是,當錯誤橫幅可見時,我的 RecyclerView 的最后一項被切斷,我認為錯誤橫幅的高度。 只有當我再次編輯它並顯示鍵盤時,它才會被修復,recyclerview 的高度被刷新(可能)。

這是我的布局 XML:

<?xml version="1.0" encoding="utf-8"?>
<layout 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"
    tools:context=".presentation.screens.gradesetup.gradingcategories.GradingCategoriesFragment">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layoutParent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/layoutGradeCategoryList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constrainedHeight="true" >

            <TextView
                android:id="@+id/tvInvalidGradeWeightLayout"
                style="@style/Default_Text_Error_Banner"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="@dimen/default_margin_size_16dp"
                android:text="@string/error_invalid_grade_category_weight"
                android:visibility="gone" />

            <!-- Constraint layout_constraintHeight_max dynamically to 24% -->
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rvGradingCategories"
                android:layout_width="match_parent"
                android:layout_height="wrap_content" />

        </androidx.appcompat.widget.LinearLayoutCompat>

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/tvInfoNoData"
            style="@style/Default_Text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/text_no_data_display"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.constraintlayout.widget.Barrier
            android:id="@+id/barrier"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:barrierDirection="bottom"
            app:constraint_referenced_ids="layoutGradeCategoryList" />

        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/layout_adjust_weight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/default_margin_size_16dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toTopOf="@+id/buttonSave"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/barrier"
            app:layout_constraintVertical_bias="0.01">

            <com.google.android.material.switchmaterial.SwitchMaterial
                android:id="@+id/switchViewAdjustWeight"
                style="@style/Default_Text_Bold"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="@dimen/screen_padding_size"
                android:text="@string/text_adjust_weight"
                android:theme="@style/Theme.LMS"
                android:visibility="gone" />

        </androidx.appcompat.widget.LinearLayoutCompat>

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/default_margin_size_30dp"
            android:src="@drawable/ic_plus"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:tint="@color/white" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/buttonSave"
            style="@style/Primary_Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/default_margin_size_30dp"
            android:enabled="false"
            android:text="@string/text_save"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

可以看到我也有這個Constraint Barrier,所以每當RecyclerView的高度變長時,SwitchMaterial("switchViewAdjustWeight")也會調整。 我根據設備高度動態設置了 android:layout_constraintHeight_max。

// Dynamically set constraintMaxHeight
var constraintMaxHeight = 0
constraintMaxHeight =
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
        val windowMetrics = activity!!.windowManager.currentWindowMetrics
        val insets: Insets = windowMetrics.windowInsets
            .getInsetsIgnoringVisibility(WindowInsets.Type.systemBars())
        val height = windowMetrics.bounds.height() - insets.top - insets.bottom
        (height * 0.7).toInt()
    } else {
        val displayMetrics = DisplayMetrics()
        activity!!.windowManager.defaultDisplay.getMetrics(displayMetrics)
        (displayMetrics.heightPixels * 0.7).toInt()
    }

val constraintSet = ConstraintSet()
constraintSet.clone(layoutParent)
constraintSet.constrainMaxHeight(R.id.layoutGradeCategoryList, constraintMaxHeight)
constraintSet.applyTo(layoutParent)

在我的代碼(kotlin)中:如果 sum != 100,錯誤橫幅將切換為可見

val result = sum == 100
binding.apply {
     buttonSave.isEnabled = result
     tvInvalidGradeWeightLayout.isVisible = !result
}

在此處輸入圖像描述

在此處輸入圖像描述

目標用戶界面:

在此處輸入圖像描述

我也確實將 LinearLayout 更改為 ConstraintLayout 但是它不起作用,橫幅與 RecyclerView 列表重疊:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <androidx.constraintlayout.widget.ConstraintLayout
        android:id="@+id/layoutParent"
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <androidx.constraintlayout.widget.ConstraintLayout
            android:id="@+id/layoutGradeCategoryList"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constrainedHeight="true" >

            <TextView
                android:id="@+id/tvInvalidGradeWeightLayout"
                style="@style/Default_Text_Error_Banner"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:padding="@dimen/default_margin_size_16dp"
                android:text="@string/error_invalid_grade_category_weight"
                android:visibility="gone"
                app:layout_constraintTop_toTopOf="parent"/>

            <!-- Constraint layout_constraintHeight_max dynamically to 24% -->
            <androidx.recyclerview.widget.RecyclerView
                android:id="@+id/rvGradingCategories"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                app:layout_constrainedHeight="true"
                app:layout_constraintTop_toBottomOf="@+id/tvInvalidGradeWeightLayout" />

        </androidx.constraintlayout.widget.ConstraintLayout>

        <androidx.appcompat.widget.AppCompatTextView
            android:id="@+id/tvInfoNoData"
            style="@style/Default_Text"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:text="@string/text_no_data_display"
            android:visibility="visible"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toTopOf="parent" />

        <androidx.constraintlayout.widget.Barrier
            android:id="@+id/barrier"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:barrierDirection="bottom"
            app:constraint_referenced_ids="layoutGradeCategoryList" />

        <androidx.appcompat.widget.LinearLayoutCompat
            android:id="@+id/layout_adjust_weight"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginBottom="@dimen/default_margin_size_16dp"
            android:orientation="horizontal"
            app:layout_constraintBottom_toTopOf="@+id/buttonSave"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/barrier"
            app:layout_constraintVertical_bias="0.01">

            <com.google.android.material.switchmaterial.SwitchMaterial
                android:id="@+id/switchViewAdjustWeight"
                style="@style/Default_Text_Bold"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentEnd="true"
                android:layout_centerVertical="true"
                android:layout_marginEnd="@dimen/screen_padding_size"
                android:text="@string/text_adjust_weight"
                android:theme="@style/Theme.LMS"
                android:visibility="gone" />

        </androidx.appcompat.widget.LinearLayoutCompat>

        <com.google.android.material.floatingactionbutton.FloatingActionButton
            android:id="@+id/fab"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/default_margin_size_30dp"
            android:src="@drawable/ic_plus"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:tint="@color/white" />

        <androidx.appcompat.widget.AppCompatButton
            android:id="@+id/buttonSave"
            style="@style/Primary_Button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="@dimen/default_margin_size_30dp"
            android:enabled="false"
            android:text="@string/text_save"
            android:visibility="gone"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintEnd_toEndOf="parent" />

    </androidx.constraintlayout.widget.ConstraintLayout>

</layout>

這對我有用,我為 layoutGradeCategoryList 添加了 getViewTreeObserver().addOnGlobalLayoutListener 並在那里觸發請求布局。

layoutGradeCategoryList.getViewTreeObserver().addOnGlobalLayoutListener(OnGlobalLayoutListener {
    layoutGradeCategoryList.requestLayout();
})

這有助於我更多地了解 requestLayout/forceLayout/invalidate 視圖。 https://stackoverflow.com/a/42430695/3777452

希望這對其他人有幫助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM