لماذا لا تعمل الحالة المضغوطة لقائمة ColorStateList مع عنصر ListView؟
-
21-12-2019 - |
سؤال
أحاول إعداد ListView
مع عناصر ذات ألوان خلفية مختلفة، لذا فإن المحول الخاص بي getView()
استدعاءات الطريقة setBackgroundResource()
باستخدام مورد قابل للرسم مناسب للون الخلفية المطلوب.
إذا قمت باستخدام أ ColorDrawable
الذي يشير أ ColorStateList
كلون له، لون الحالة المضغوطة من ColorStateList
لا يتم رسمه عندما أنقر على العنصر.
إذا قمت باستخدام أ StateListDrawable
الذي يشير أ ColorDrawable
لحالة الضغط ومختلفة ColorDrawable
بالنسبة للحالة غير المضغوطة، أحصل على تأثير التمييز المطلوب عندما أنقر على العنصر.
لقد قمت بإعداد مشروع بسيط لإثبات ذلك.هنا هو getView()
الطريقة من ListAdapter
:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View retval = getLayoutInflater().inflate(android.R.layout.simple_list_item_1, parent, false);
TextView textView = (TextView)retval.findViewById(android.R.id.text1);
textView.setText("" + position);
switch ( position ) {
case 0:
retval.setBackgroundResource(R.drawable.list_background_item_0);
break;
case 1:
retval.setBackgroundResource(R.drawable.list_background_item_1);
break;
}
return retval;
}
الدقة/drawable/list_background_item_0.xml:
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/list_background_item_0" />
الدقة/اللون/list_background_item_0.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:color="@color/list_background_item_0_pressed"/>
<item android:color="@color/list_background_item_0_default"/>
</selector>
الدقة/drawable/list_background_item_1.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@drawable/list_background_item_1_pressed" />
<item android:drawable="@drawable/list_background_item_1_default" />
</selector>
res/drawable/list_background_item_1_default.xml:
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/list_background_item_1_default" />
res/drawable/list_background_item_1_pressed.xml:
<color xmlns:android="http://schemas.android.com/apk/res/android"
android:color="@color/list_background_item_1_pressed" />
الدقة/القيم/colors.xml:
<resources>
<color name="list_background_item_0_default">#FFCCCC</color>
<color name="list_background_item_0_pressed">#996666</color>
<color name="list_background_item_1_default">#CCFFCC</color>
<color name="list_background_item_1_pressed">#669966</color>
</resources>
تم تكوين عنصر القائمة 0 باستخدام a ColorDrawable
الذي يشير أ ColorStateList
ولا يعرض تسليط الضوء عند الضغط عليه.تم تكوين عنصر القائمة 1 بـ StateListDrawable
ويعرض التمييز.
أفضل استخدام ColorStateList
من ال StateListDrawable
لأنه يبدو أكثر نظافة ويتضمن ملفًا أقل لكل نوع عنصر.هل هناك شيء فاتني يسمح لي باستخدام هذه الطريقة؟إذا لم يكن المقصود منه العمل كما أتوقع، فهل يمكن لأحد أن يشرح السبب؟
المحلول
شكرا ل لوكسبروغتعليقًا، علمت أن الرسوميات المشار إليها بواسطة StateListDrawable
يمكن أن تكون الألوان من colors.xml
.وهذا يجعل StateListDrawable
الحل المفضل ل ColorStateList
إصدار.
الحل النهائي هو...
getView()
طريقة:
- لا تغيرات
الدقة/اللون/list_background_item_0.xml:
- تم الحذف
الدقة/drawable/list_background_item_0.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/list_background_item_0_pressed" />
<item android:drawable="@color/list_background_item_0_default" />
</selector>
الدقة/drawable/list_background_item_1.xml:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" android:drawable="@color/list_background_item_1_pressed" />
<item android:drawable="@color/list_background_item_1_default" />
</selector>
res/drawable/list_background_item_1_default.xml:
- تم الحذف
res/drawable/list_background_item_1_pressed.xml:
- تم الحذف
الدقة/القيم/colors.xml:
- لا تغيرات
هذا الحل نظيف أو أنظف مما كنت أتوقعه ColorStateList
الإصدار الذي كان يعمل.