لماذا لا تعمل الحالة المضغوطة لقائمة ColorStateList مع عنصر ListView؟

StackOverflow https://stackoverflow.com//questions/21006631

سؤال

أحاول إعداد 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 الإصدار الذي كان يعمل.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top