Как я могу использовать ColorStateList в ViewHolder для RecyclerView? - PullRequest
0 голосов
/ 12 апреля 2019

Я пытаюсь использовать ColorStateList для раскрашивания элементов в моем RecyclerView. Вот XML для моего ViewHolder:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:background="@drawable/view_colors"
>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8sp"
        android:id="@+id/entry_image"
        android:layout_gravity="center_horizontal"
        />
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:padding="8sp"
        android:id="@+id/entry_text"
        android:textStyle="bold"
        android:layout_gravity="center_horizontal"
        />
</LinearLayout>

А вот мой view_colors.xml, в котором содержится список состояний цветов:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true"   
android:drawable="@color/colorPrimary"/>
<item android:state_focused="true"   android:drawable="@color/colorAccent"/>
<item android:drawable="@color/colorPrimaryDark"/>
</selector>

Когда я использовал ColorStateList в res / colors и применил его к тегу textColor, он работал нормально. Я попробовал то же самое с фоновым тегом, и получил эту ошибку. Поэтому я посмотрел на другие вопросы здесь и затем попытался использовать XML в res / drawable, который определял drawables вместо цветов (как видно выше), но это не решило проблему.

РЕДАКТИРОВАТЬ: Это нормально работает на моем телефоне с API уровня 27, но ошибка появляется на моем телефоне уровня API 23.

Вот полная трассировка стека: 2019-04-12 13: 47: 39.419 22410-22410 / com.example.realrecyclerview E / linker: сбой чтения (''): нет такого файла или каталога [fd = 31] 2019-04-12 13: 47: 39.419 22410-22410 / com.example.realrecyclerview E / linker: предупреждение: невозможно получить реальный путь для библиотеки "/data/app/com.example.realrecyclerview-1/oat/arm/ base.odex». Будет использовать имя. 2019-04-12 13: 47: 41.305 22410-22410 / com.example.realrecyclerview E / linker: сбой readlink (''): такого файла или каталога нет [fd = 38] 2019-04-12 13: 47: 41.305 22410-22410 / com.example.realrecyclerview E / linker: предупреждение: невозможно получить реальный путь для библиотеки "/system/lib/hw/gralloc.sc8830.so". Будет использовать имя. 2019-04-12 13: 47: 41.420 22410-22410 / com.example.realrecyclerview E / AndroidRuntime: ОСНОВНОЕ ИСКЛЮЧЕНИЕ: основное Процесс: com.example.realrecyclerview, PID: 22410 android.view.InflateException: строка двоичного файла XML №2: строка двоичного файла XML №2: ошибка надувания класса на android.view.LayoutInflater.inflate (LayoutInflater.java:539) на android.view.LayoutInflater.inflate (LayoutInflater.java:423) в com.example.realrecyclerview.HarvestAdapter.onCreateViewHolder (HarvestAdapter.java:48) в com.example.realrecyclerview.HarvestAdapter.onCreateViewHolder (HarvestAdapter.java:14) на android.support.v7.widget.RecyclerView $ Adapter.createViewHolder (RecyclerView.java:6794) на android.support.v7.widget.RecyclerView $ Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:5975) на android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition (RecyclerView.java:5858) на android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition (RecyclerView.java:5854) на android.support.v7.widget.LinearLayoutManager $ LayoutState.next (LinearLayoutManager.java:2230) на android.support.v7.widget.GridLayoutManager.layoutChunk (GridLayoutManager.java:557) на android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1517) на android.support.v7.widget.LinearLayoutManager.onLayoutChildren (LinearLayoutManager.java:612) на android.support.v7.widget.GridLayoutManager.onLayoutChildren (GridLayoutManager.java:171) на android.support.v7.widget.RecyclerView.dispatchLayoutStep2 (RecyclerView.java:3924) на android.support.v7.widget.RecyclerView.dispatchLayout (RecyclerView.java:3641) на android.support.v7.widget.RecyclerView.onLayout (RecyclerView.java:4194) на android.view.View.layout (View.java:16645) на android.view.ViewGroup.layout (ViewGroup.java:5471) на android.widget.LinearLayout.setChildFrame (LinearLayout.java:1743) на android.widget.LinearLayout.layoutHorizont (LinearLayout.java:1732) на android.widget.LinearLayout.onLayout (LinearLayout.java:1497) на android.view.View.layout (View.java:16645) на android.view.ViewGroup.layout (ViewGroup.java:5471) на android.widget.FrameLayout.layoutChildren (FrameLayout.java:336) на android.widget.FrameLayout.onLayout (FrameLayout.java:273) на android.view.View.layout (View.java:16645) на android.view.ViewGroup.layout (ViewGroup.java:5471) на android.support.v7.widget.ActionBarOverlayLayout.onLayout (ActionBarOverlayLayout.java:444)на android.view.View.layout (View.java:16645) на android.view.ViewGroup.layout (ViewGroup.java:5471) на android.widget.FrameLayout.layoutChildren (FrameLayout.java:336) на android.widget.FrameLayout.onLayout (FrameLayout.java:273) в android.view.View.layout (View.java:16645) в android.view.ViewGroup.layout (ViewGroup.java:5471) в android.widget.LinearLayout.setChildFrame (LinearLayout.java: 1743) в android.widget.LinearLayout.layoutVertical (LinearLayout.java:1586) в android.widget.LinearLayout.onLayout (LinearLayout.java:1495) в android.view.View.layout (View.java:16645)на android.view.ViewGroup.layout (ViewGroup.java:5471) на android.widget.FrameLayout.layoutChildren (FrameLayout.java:336) на android.widget.FrameLayout.onLayout (FrameLayout.java:273) на com.android.internal.policy.PhoneWindow $ DecorView.onLayout (PhoneWindow.java:2694) на android.view.View.layout (View.java:16645) на android.view.ViewGroup.layout (ViewGroup.java:5471) на android.view.ViewRootImpl.performLayout (ViewRootImpl.java: 2171) в android.view.ViewRootImpl.performTraversals (ViewRootImpl.java:1931) в android.view.ViewRootImpl.doTraversal (ViewRootImpl.java:1107) в android.view.ViewRootImpl $ TraversalRunnable.ot.Ivl ()на android.view.Choreographer $ CallbackRecord.run (Choreographer.java:858) на android.view.Choreographer.doCallbacks (Choreographer.java:670) на android.view.Choreographer.doFrame (Choreographer.java:606 at)view.Choreographer $ FrameDisplayEventReceiver.run (Choreographer.java:844) на android.os.Handler.handleCallback (Handler.java:739) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:148) на android.app.ActivityThread.main (Acti

Ответы [ 2 ]

0 голосов
/ 17 апреля 2019

Проблема заключалась в записи в селекторе, с которым не было связано состояние.Я удалил следующую строку, и она отлично работает на всех моих устройствах:

<item android:drawable="@color/colorPrimaryDark"/>
0 голосов
/ 12 апреля 2019

Исключение времени выполнения обычно содержит ошибку в макете или XML-файле. Пожалуйста, дайте полную трассировку исключений LogCat.

Кроме того, вы упомянули, что хотите ColorStateList , но при этом вы используете рисование. Не использовал цвета в рисованном селекторе. Если вам нужен только Colous, попробуйте выбрать цвет. Тот же XML-файл, просто переместите его в «цветную» папку Res и замените android: drawable на android: color

...