Android多个Progressbar实例未正确更新

问题描述 投票:0回答:1

我有一个带有进度条的CustomView。自定义视图具有进度栏,标题和文本进度为“ 1/5”。我在多个地方使用了这个CustomView(ProgressBadgeWidget),包括在RecyclerView的项目布局中使用了两次(item_levels.xml-为此进行了简化):

<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="wrap_content"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"

>

<com.trala.learn.violin.view.core.widgets.ProgressBadgeWidget
    android:id="@+id/courses_done_progress_widget"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:elevation="4dp"
    android:visibility="visible"
    app:badge_image="@drawable/trophy_gold"
    app:layout_constraintBottom_toBottomOf="@id/background_image"
    app:layout_constraintEnd_toEndOf="@id/background_image"
    app:layout_constraintHeight_percent="0.18"
    app:layout_constraintHorizontal_bias="0.12"
    app:layout_constraintStart_toStartOf="@id/background_image"
    app:layout_constraintTop_toTopOf="@id/background_image"
    app:layout_constraintVertical_bias="0.96"
    app:layout_constraintWidth_percent="0.24"
    app:progress_badge_title="@string/courses_done"
    app:progress_bar_background_color="@color/progress_bar_background_default"
    app:progress_text_color="@color/progress_bar_background_course_header"

    />


<com.trala.learn.violin.view.core.widgets.ProgressBadgeWidget
    android:id="@+id/medals_earned_progress_widget"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:elevation="4dp"
    android:visibility="visible"
    app:badge_image="@drawable/medal_gold_small"
    app:layout_constraintBottom_toBottomOf="@id/background_image"
    app:layout_constraintEnd_toEndOf="@id/background_image"
    app:layout_constraintHeight_percent="0.18"
    app:layout_constraintHorizontal_bias="0.85"
    app:layout_constraintStart_toStartOf="@id/background_image"
    app:layout_constraintTop_toTopOf="@id/background_image"
    app:layout_constraintVertical_bias="0.96"
    app:layout_constraintWidth_percent="0.24"
    app:progress_badge_title="@string/medals_earned"
    app:progress_bar_background_color="@color/progress_bar_background_default"
    app:progress_bar_foreground_color="@color/progress_bar_default_color"
    app:progress_text_color="@color/progress_bar_background_course_header" />

ProgressBadgeWidget的xml布局如下:

<merge 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:gravity="center_horizontal"
tools:parentTag="com.trala.learn.violin.view.core.widgets.ProgressBadgeWidget">

<TextView
    android:id="@+id/badge_title"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:fontFamily="@font/avenir_family"
    android:gravity="center"
    android:letterSpacing="-0.04"
    android:textColor="@color/courses_badge_text_color"
    android:textSize="12sp"
    app:lineHeight="16sp"
    app:layout_constraintBottom_toTopOf="@id/badge_image"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"

    />

<com.trala.learn.violin.view.core.widgets.EZColorProgressBar
    android:id="@+id/progress_badge_widget_progress_bar"
    android:layout_width="0dp"
    android:layout_height="0dp"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintHeight_percent="0.10"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:layout_constraintWidth_percent="0.90"
    tools:progress="50" />

<ImageView
    android:id="@+id/badge_image"
    android:layout_width="0dp"
    android:layout_height="0dp"
    android:visibility="invisible"
    app:layout_constraintBottom_toBottomOf="@id/progress_badge_widget_progress_bar"
    app:layout_constraintDimensionRatio="1:1"
    app:layout_constraintEnd_toEndOf="@id/progress_badge_widget_progress_bar"
    app:layout_constraintStart_toStartOf="@id/progress_badge_widget_progress_bar"
    app:layout_constraintTop_toTopOf="@id/progress_badge_widget_progress_bar"
    app:layout_constraintWidth_percent="0.27"
    tools:src="@drawable/trophy_gold" />

<TextView
    android:id="@+id/progress_text"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:fontFamily="@font/avenir_family"
    android:textColor="@color/courses_badge_text_color"
    android:textSize="12sp"
    android:textStyle="bold"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toBottomOf="@id/badge_image"
    tools:text="4/7" />

非常简单,如前所述。主要部分是EZColorProgressBar,它是ProgressBar的子类,仅提供更改条形颜色的方法以及设置进度和最大值的方法:

 class EZColorProgressBar @JvmOverloads constructor(context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = android.R.attr.progressBarStyleHorizontal, defStyleRes: Int = 0):
            ProgressBar(context, attrs, defStyleAttr, defStyleRes) {


fun setProgressNumbers(currentCount: Int, totalCount: Int) {
        if (currentCount > totalCount) Timber.d("Current Badge Count > Total Badge Count")

        val shouldShowBadges = currentCount >= totalCount && (currentCount != 0 && totalCount != 0)
        showBadge(shouldShowBadges)

        viewBinding?.progressBadgeWidgetProgressBar?.setMax(totalCount)
        viewBinding?.progressBadgeWidgetProgressBar?.setProgress(currentCount)
        viewBinding?.progressText?.setText(String.format(context.getString(R.string.score_string), currentCount, totalCount))


      }
}

我几乎在所有片段上都使用ProgressBadgeWidget和EZProgressBar。当我在片段之间浏览并向后浏览时,进度条并不总是正确地显示其编号,即,第一次0/5将正确显示,然后导航到使用此EZProgressBar的其他页面并向后导航将显示1/5,即使文本为0/5。

第一次导航:enter image description here

之后:数据模型支持进度条是正确的(从0/5可以看到正确)。看起来它正在应用其他进度条中的3/11

enter image description here

[发生这种情况时,实际上会将错误的进度条编号应用于布局中的所有进度条(即,recyclerview适配器中item_level的所有项目中的每个进度条,甚至是单独的片段,因此都不会与recyclerview绑定。)但是再次正确显示所有文本“ x / x”。

我曾尝试使用Kotlin合成绑定和google view绑定。感觉就像进度条的单独实例(它们在我打印出哈希码时是分开的)一样,它们指向同一进度条,因为它是基于ID来搜索视图的。 ProgressBadgeWidget具有唯一的ID,但它们的嵌套进度条具有相同的ID。

有人遇到过这样的问题,和/或特别是关于Android Progress Bars?

android android-custom-view android-progressbar android-viewbinding
1个回答
0
投票

[如果有人遇到多个进度条无法正确更新的问题,则似乎存在与此相关的Android大错误。解决方法是在设置正确的数字之前显式更改/重置最大和进度值。我将这些方法添加到我的自定义进度栏中:

fun setProgressSafely(progress: Int) {
    setProgress(progress + 1)
    setProgress(progress)
}

fun setMaxSafely(max: Int) {
    setMax(max + 1)
    setMax(max)
}
© www.soinside.com 2019 - 2024. All rights reserved.