我有一个带有进度条的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。
之后:数据模型支持进度条是正确的(从0/5可以看到正确)。看起来它正在应用其他进度条中的3/11
[发生这种情况时,实际上会将错误的进度条编号应用于布局中的所有进度条(即,recyclerview适配器中item_level的所有项目中的每个进度条,甚至是单独的片段,因此都不会与recyclerview绑定。)但是再次正确显示所有文本“ x / x”。
我曾尝试使用Kotlin合成绑定和google view绑定。感觉就像进度条的单独实例(它们在我打印出哈希码时是分开的)一样,它们指向同一进度条,因为它是基于ID来搜索视图的。 ProgressBadgeWidget具有唯一的ID,但它们的嵌套进度条具有相同的ID。
有人遇到过这样的问题,和/或特别是关于Android Progress Bars?
[如果有人遇到多个进度条无法正确更新的问题,则似乎存在与此相关的Android大错误。解决方法是在设置正确的数字之前显式更改/重置最大和进度值。我将这些方法添加到我的自定义进度栏中:
fun setProgressSafely(progress: Int) {
setProgress(progress + 1)
setProgress(progress)
}
fun setMaxSafely(max: Int) {
setMax(max + 1)
setMax(max)
}