Проблема с attr Android на minSDK
на Android 8.0 работает отлично.
на Android 4.1 падает
02-06 15:20:17.373 4246-4246/? E/AndroidRuntime: FATAL EXCEPTION: main
android.view.InflateException: Binary XML file line #49: Error inflating class TextView
at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:704)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:746)
at android.view.LayoutInflater.inflate(LayoutInflater.java:489)
at android.view.LayoutInflater.inflate(LayoutInflater.java:396)
at ru.ddstudio.simpleitunesapp.ui.album_list.AlbumListAdapter.onCreateViewHolder(AlbumListAdapter.kt:22)
at ru.ddstudio.simpleitunesapp.ui.album_list.AlbumListAdapter.onCreateViewHolder(AlbumListAdapter.kt:14)
at androidx.recyclerview.widget.RecyclerView$Adapter.createViewHolder(RecyclerView.java:7078)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6235)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6118)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6114)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2303)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1627)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1587)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:665)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4134)
at androidx.recyclerview.widget.RecyclerView.dispatchLayout(RecyclerView.java:3851)
at androidx.recyclerview.widget.RecyclerView.onLayout(RecyclerView.java:4404)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at androidx.constraintlayout.widget.ConstraintLayout.onLayout(ConstraintLayout.java:1915)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at androidx.coordinatorlayout.widget.CoordinatorLayout.layoutChild(CoordinatorLayout.java:1183)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayoutChild(CoordinatorLayout.java:870)
at androidx.coordinatorlayout.widget.CoordinatorLayout.onLayout(CoordinatorLayout.java:889)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1649)
at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1507)
at android.widget.LinearLayout.onLayout(LinearLayout.java:1420)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.widget.FrameLayout.onLayout(FrameLayout.java:448)
at android.view.View.layout(View.java:13754)
at android.view.ViewGroup.layout(ViewGroup.java:4364)
at android.view.ViewRootImpl.performLayout(ViewRootImpl.java:1868)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1689)
at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1000)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4214)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:725)
at android.view.Choreographer.doCallbacks(Choreographer.java:555)
at android.view.Choreographer.doFrame(Choreogr
Посмотрев на TextView я начал экспериментировать, чтобы узнать ошибку
<TextView
android:id="@+id/tv_price"
style="@style/TextView.Counter"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginStart="8dp"
android:layout_marginLeft="8dp"
android:background="@drawable/bg_counter"
android:gravity="center"
android:minWidth="@dimen/counter_size"
app:layout_constraintBottom_toBottomOf="@+id/tv_collection_name"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toEndOf="@+id/tv_collection_name"
app:layout_constraintTop_toTopOf="@+id/tv_collection_name"
tools:text="13,33 USD" />
было определено, что падает из-за android:background="@drawable/bg_counter"
bg_counter состоит из
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="10dp"/>
<solid android:color="?attr/colorCounter"/>
</shape>
</item>
</selector>
Цвет я устанавливаю с помощью темы:
<resources>
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
<item name="colorItemView">@android:color/white</item>
<item name="colorTitle">@color/color_primary</item>
<item name="colorText">@color/color_gray_dark</item>
<item name="colorCounter">@color/color_indicator</item>
</style>
</resources>
Сначала я подумал, что это из-за цвета, но поменяв его, ошибка не исчезла. Затем я подумал, что из-за темы, поэтому создал отдельный themes.xml (v21) и поменял родителя
<resources>
<style name="AppTheme" parent="AppTheme.NoActionBar">
<item name="colorItemView">@android:color/white</item>
<item name="colorTitle">@color/color_primary</item>
<item name="colorText">@color/color_gray_dark</item>
<item name="colorCounter">@color/color_indicator</item>
</style>
</resources>
Но ошибка также не исчезла.
Затем я вместо attr вставил цвет напрямую
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item>
<shape android:shape="rectangle">
<corners android:radius="10dp"/>
<!-- <solid android:color="?attr/colorCounter"/>-->
<solid android:color="@color/color_indicator"/>
</shape>
</item>
</selector>
И у меня все заработало. В чем была ошибка?
Ответы (1 шт):
Автор решения: beeline09
→ Ссылка
Используйте AppCompatTextView. Он поддерживает на старых API то, что поддерживается начиная с API 21. У меня это решило проблему.