कस्टम चयनकर्ता के माध्यम से सूची दृश्य आइटम पृष्ठभूमि


98

क्या सूची चयनकर्ता के माध्यम से प्रत्येक सूची आइटम पर एक कस्टम पृष्ठभूमि लागू करना संभव है?

डिफ़ॉल्ट चयनकर्ता मामले के @android:color/transparentलिए निर्दिष्ट करता state_focused="false"है, लेकिन इसे कुछ कस्टम ड्रॉबल में बदलने से उन आइटम प्रभावित नहीं होते हैं जो चयनित नहीं हैं। रोमेन गाइ इस उत्तर में सुझाव देते हैं कि यह संभव है।

मैं वर्तमान में प्रत्येक दृश्य पर एक कस्टम पृष्ठभूमि का उपयोग करके इसे प्रभावित कर रहा हूं और इसे तब छुपा रहा हूं जब आइटम का चयन / ध्यान केंद्रित / जो कुछ भी हो, इसलिए चयनकर्ता को दिखाया गया है, लेकिन यह सब एक स्थान पर परिभाषित होने के लिए अधिक सुरुचिपूर्ण होगा।

संदर्भ के लिए, यह चयनकर्ता है जो मैं कोशिश कर रहा हूं और इसे काम कर रहा हूं:

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:state_focused="false"
        android:drawable="@drawable/list_item_gradient" />

    <!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
    <item android:state_focused="true" android:state_enabled="false"
        android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_disabled" />
    <item android:state_focused="true" android:state_enabled="false"
        android:drawable="@drawable/list_selector_background_disabled" />

    <item android:state_focused="true" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />
    <item android:state_focused="false" android:state_pressed="true"
        android:drawable="@drawable/list_selector_background_transition" />

    <item android:state_focused="true"
        android:drawable="@drawable/list_selector_background_focus" />

</selector>

और यह है कि मैं चयनकर्ता को कैसे सेट कर रहा हूं:

<ListView
    android:id="@android:id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:listSelector="@drawable/list_selector_background" />    

किसी भी सहायता के लिए अग्रिम रूप से धन्यवाद!

जवाबों:


128

मैंने खुद से निराश होकर आखिरकार इसे हल कर लिया है। जैसा कि रोमेन गाई ने संकेत दिया, एक और राज्य है "android:state_selected", जिसका आपको उपयोग करना चाहिए। अपनी सूची आइटम की पृष्ठभूमि के लिए एक राज्य का उपयोग करने योग्य है, और के लिए एक अलग राज्य का उपयोग करेंlistSelector करें:

list_row_layout.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="?android:attr/listPreferredItemHeight"
    android:background="@drawable/listitem_background"
    >
...
</LinearLayout>

listitem_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_selected="true" android:drawable="@color/android:transparent" />
    <item android:drawable="@drawable/listitem_normal" />
</selector>

Layout.xml जिसमें सूची दृश्य शामिल हैं:

...
<ListView 
   android:layout_width="fill_parent"
   android:layout_height="wrap_content"
   android:listSelector="@drawable/listitem_selector"
   />
...

listitem_selector.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="@drawable/listitem_pressed" />
    <item android:state_focused="true" android:drawable="@drawable/listitem_selected" />
</selector>

1
में गहराई से प्रतिक्रिया के लिए धन्यवाद। जैसा कि मैंने अपने प्रश्न में उल्लेख किया है, यह वही है जो मैं इस समय भी कर रहा हूं और यह काफी अच्छी तरह से काम करता है।
शिल्पगिरा

दुर्भाग्य से, मुझे अभी भी अपनी सूची दृश्य को अनुकूलित करने में समस्याएँ हो रही हैं। मैंने अपने विशिष्ट मुद्दों को यहां पोस्ट किया: stackoverflow.com/questions/5426385/… ; मैं आपके पास किसी भी इनपुट की सराहना करूंगा।
LostNomad311 22:24

जब आप पृष्ठभूमि के रूप में पैडिंग के साथ 9-पैच ड्रॉबल्स का उपयोग करते हैं तो यह काम नहीं करता है। मुझे लगता है कि मुझे अंतिम समाधान मिल गया है, मुझे लगता है कि मेरा जवाब देखिए
माइकेल के

यह पोस्ट-आईसीएस के लिए काम करता है, लेकिन जिंजरब्रेड के लिए पूरी सूची दबाए गए या चयनित ड्रॉबल के साथ रंगीन है।
गनर

क्या पूर्व-आईसीएस के लिए कोई समाधान है?
लोनली-लोकली

78

Dglmtn द्वारा समाधान तब काम नहीं करता जब आपके पास पृष्ठभूमि के रूप में पैडिंग के साथ 9-पैच ड्रॉबल हो। अजीब चीजें होती हैं, मैं इसके बारे में बात करना भी नहीं चाहता, अगर आपको ऐसी कोई समस्या है, तो आप उन्हें जानते हैं।

अब, यदि आप अलग-अलग राज्यों और 9-पैच ड्रॉबल्स के साथ एक सूची बनाना चाहते हैं (यह किसी भी ड्रॉबल्स और रंगों के साथ काम करेगा, मुझे लगता है) आपको 2 चीजें करनी होंगी:

  1. सूची में आइटम के लिए चयनकर्ता सेट करें।
  2. सूची के लिए डिफ़ॉल्ट चयनकर्ता से छुटकारा पाएं।

आपको जो करना चाहिए वह पहले row_selector.xml सेट करें:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android" >
    <item android:state_enabled="true" 
     android:state_pressed="true" android:drawable="@drawable/list_item_bg_pressed" />
    <item android:state_enabled="true"
     android:state_focused="true" android:drawable="@drawable/list_item_bg_focused" />
    <item android:state_enabled="true"
     android:state_selected="true" android:drawable="@drawable/list_item_bg_focused" />
    <item
     android:drawable="@drawable/list_item_bg_normal" />
</selector>

मत भूलना android:state_selected। यह android:state_focusedसूची के लिए काम करता है , लेकिन यह सूची आइटम के लिए लागू होता है।

अब चयनकर्ता को आइटम पर लागू करें (row.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:background="@drawable/row_selector"
>
...
</RelativeLayout>

सूची के लिए एक पारदर्शी चयनकर्ता बनाएं:

<ListView
    android:id="@+id/android:list"
    ...
    android:listSelector="@android:color/transparent"
    />

यह बात करनी चाहिए।


1
+1, मैंने आपका उत्तर पहले नहीं देखा था, मैं उसी परिणाम पर आया था जो मैं स्वयं कर रहा था। लेकिन 9-पैच ड्रॉबल्स के बारे में उल्लेख करने के लिए धन्यवाद मुझे यकीन है कि यह मेरे भविष्य के कार्यान्वयन में उपयोगी हो सकता है। यह सबसे अच्छा उत्तर होना चाहिए क्योंकि यह विधि क्लीनर और बनाए रखने योग्य है।
आइजैकसिनारोस 13

28
मुझे खेद है, लेकिन यह इस तरह की बातें हैं जो कभी-कभी सोचती हैं कि इन लानत यूआई एप्स को इतना भद्दा क्यों होना पड़ता है। एंड्रॉइड के पास अभी भी बहुत कुछ है। इस तरह की बुनियादी चीजों के लिए ऐसा PITA नहीं होना चाहिए।
गोबट्रॉन

2
+1 धन्यवाद, धन्यवाद, धन्यवाद। कुछ मूल हासिल करने के लिए इन सभी हुप्स के माध्यम से कूदना। ये सभी राज्य बहुत भ्रामक हैं।
मोरिट्ज़

3
Android के बजाय: listSelector = "@ drawable / list_selector" बस Android लिखें: listSelector = "@ android: color / पारदर्शी"। अतिरिक्त list_selector.xml के लिए कोई ज़रूरत नहीं है।
सोफी सॉफ्टवेयर एलएलसी

1
सही है, गैर-विध्वंसक सूची चयनकर्ता सिर्फ अपने स्वयं के xml चयनकर्ता के बजाय @android: color / पारदर्शी हो सकता है। बस कोशिश की। वह चीज़ जो काम नहीं करती है वह है @ null, जो मुझे आश्चर्यचकित करती है क्योंकि उसे यह बताना चाहिए: "कोई सूची चयनकर्ता नहीं" और जैसा कि सूची चयनकर्ता आइटम के पीछे खींचा जाता है, कुछ भी नहीं खींचा जाना चाहिए। लेकिन वह काम नहीं करता है, डिफ़ॉल्ट चयनकर्ता फिर वापस आ जाता है ...
जोर्डिड

17

अपनी सूची पंक्तियों के लिए कभी भी "पृष्ठभूमि रंग" का उपयोग न करें ...

यह हर चयनकर्ता कार्रवाई को अवरुद्ध करेगा (मेरी समस्या थी!)

सौभाग्य!


3
यह सच नहीं है। बस एक पृष्ठभूमि के रूप में एक चयनकर्ता का उपयोग करें, न कि एक स्थिर रंग या खींचने योग्य
Michał K

यह "पृष्ठभूमि रंग" से अभिप्रेत था। पूरी तरह से अपने शब्दों को स्वीकार करें।
cV2

मुझे यहां इसलिए मिला क्योंकि मुझे अब एक चयनकर्ता की आवश्यकता है जो मैंने setBackgroundColor"रंग" के साथ उपयोग किया है। Sigh ... चयनकर्ता के साथ अपने API संस्करण का उपयोग करें setBackgroundया उसके setBackgroundDrawableअनुसार।
एपिकपांडाफर्स

5

लेख "क्यों मेरी सूची में काला? एक Android ऑप्टिमाइज़ेशन" में Android डेवलपर ब्लॉग क्यों सूची पृष्ठभूमि काला हो जाता है जब स्क्रॉल का पूरी तरह से व्याख्या है। सरल उत्तर: अपनी सूची में पारदर्शी (# 00000000) पर cacheColorHint सेट करें।


1
एक अनुकरणीय सादगी लेकिन यह बहुत अच्छी तरह से काम करता है। रोमेन गाइ के लिए धन्यवाद ... <ListView ... Android: cacheColorHint = "# 00000000"> </ ListView> यह सब है!
एरिक जोय

रोमेन गाइ को धन्यवाद मत देना। वह समस्या का हिस्सा है। इस तरह के OS में बहुत सारे "हिडन ट्रिक्स" या अन्य हैक नहीं होने चाहिए। भले ही मैं एंड्रॉइड से प्यार करता हूं, यह अन्य एसडीके (यहां तक ​​कि नए या कम परिपक्व लोगों के साथ तुलना में) डॉगक्रैप का एक बड़ा स्टीमिंग ढेर है!)।
स्टैकऑवरफ्लो

5

यह पर्याप्त है, यदि आप इसमें डालते हैं list_row_layout.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:gravity="center_vertical"
android:background="@drawable/listitem_background">... </LinearLayout>

listitem_selector.xml:

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

2
भयानक ... सबसे सरल उदाहरण
शिहब उद्दीन

1
और सूची के चयनकर्ता को भी पारदर्शी
बनाएं

4

के बजाय:

android:drawable="@color/transparent" 

लिखो

android:drawable="@android:color/transparent"

4

आप एक विषय लिख सकते हैं:

<pre>

    android:name=".List10" android:theme="@style/Theme"

theme.xml

<style name="Theme" parent="android:Theme">
        <item name="android:listViewStyle">@style/MyListView</item>
</style>

styles.xml

 <style name="MyListView" parent="@android:style/Widget.ListView">
<item name="android:listSelector">@drawable/my_selector</item>

my_selector कस्टम चयनकर्ता को मैं चाहता हूं कि मुझे खेद है कि मुझे पता नहीं है कि मुझे अपना कोड कैसे लिखना है


मदद के लिए धन्यवाद, लेकिन यह सीधे चयनकर्ता के माध्यम से डिफ़ॉल्ट सूची पृष्ठभूमि को स्थापित करने में मदद नहीं करता है।
शिल्पगिरा

2

मुझे यकीन नहीं है कि चयनकर्ता के माध्यम से अपने वांछित प्रभाव को कैसे प्राप्त किया जाए - आखिरकार, पूरी सूची के लिए एक चयनकर्ता है।

हालाँकि, आप चयन परिवर्तनों पर नियंत्रण प्राप्त कर सकते हैं और जो चाहें प्राप्त कर सकते हैं। में इस नमूने परियोजना , मैं चयनकर्ता पारदर्शी बनाने और चयनित आइटम पर एक बार आकर्षित।


वास्तव में, यह वहाँ केवल एक चयनकर्ता के लिए होने के लिए कुल समझ में आता है। मुझे लगता है कि मैं <item android:state_focused="false" android:drawable="@android:color/transparent" />डिफ़ॉल्ट चयनकर्ता में खंड के अस्तित्व से थोड़ा भ्रमित हूं (या था) ।
शिल्पगिरा

मार्क, चारों ओर खेल रहा है (गिल के रूप में एक ही समस्या है) मैंने आपके समाधान की कोशिश की, यह केवल ट्रैक बॉल के लिए आंशिक है, कुछ भी नहीं कहा जाता है जब आप केवल स्पर्श का उपयोग करके आइटम स्पर्श करते हैं और onItemClicked को निकाल दिया जाता है, यदि आप उस तरह का कुछ चाहते हैं, तो सबसे अधिक संभावना है आपको ListView के अंदर चयनित और दबाए गए पदों का ट्रैक रखना होगा और आइटम में आपको जो कुछ भी चाहिए उसे ड्रा करना होगा (इसे कस्टम दृश्य बनाएं) और ListView के प्रेषण में।
कोडस्क्रबर

@codeScriber: "कुछ भी नहीं कहा जाता है जब आप केवल स्पर्श का उपयोग करके वस्तुओं को छूते हैं और onItemClicked को निकाल दिया जाता है" - यह पूरी तरह से सामान्य व्यवहार है, क्योंकि स्पर्श का चयन से कोई लेना-देना नहीं है।
कॉमन्सवेयर

2

मैं हमेशा एक ही विधि का उपयोग करता हूं और यह हर बार, हर जगह काम करता है: मैं बस इस तरह से चयनकर्ता का उपयोग करता हूं

<item android:state_activated="true"  android:color="@color/your_selected_color" />
<item android:state_pressed="true" android:color="@color/your_pressed_color" />
<item android:color="@color/your_normal_color"></item>

और ListView (यह काम करने के लिए बहुत महत्वपूर्ण है) पर सेट विशेषता है

android:choiceMode="singleChoice"

TextColor के लिए इस तरह एक चयनकर्ता बस रंग फ़ोल्डर (महत्वपूर्ण, नहीं फ़ोल्डर में!) में डाल दिया

<item android:state_activated="true"  android:color="@color/your_selected_textColor" />
<item android:state_pressed="true" android:color="@color/your_pressed_textColor" />
<item android:color="@color/your_normal_textColor"></item>

यह एक नमूना पंक्ति टेम्पलेट है

<ImageView
    android:id="@+skinMenu/lblIcon"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_horizontal"
    android:src="@drawable/menu_catalog" />

<TextView
    android:id="@+skinMenu/lblTitle"
    style="@style/superlabelStyle"
    android:layout_width="wrap_content"
    android:layout_height="match_parent"
    android:layout_marginLeft="20dp"
    android:gravity="center_vertical"
    android:text="test menu testo"
    android:textColor="@color/menu_textcolor_selector"
    android:textSize="20dp"
    android:textStyle="bold" />

थकाऊ काम के बिना सब कुछ शोल्ड काम करते हैं। उममीद है कि इससे मदद मिलेगी


-3

यहां पर फ्रॉस्टवायर टीम।

सभी चयनकर्ता बकवास एपीआई अपेक्षा के अनुरूप काम नहीं करते हैं। इस थ्रेड में प्रस्तुत सभी समाधानों को अच्छा नहीं करने की कोशिश करने के बाद, हमने सूची दृश्य आइटम को फुलाते समय समस्या को हल किया।

  1. सुनिश्चित करें कि आपका आइटम यह स्थिति रखता है, हमने इसे MenuItem (बूलियन चयनित) के सदस्य चर के रूप में किया था

  2. जब आप फुलाते हैं, तो पूछें कि क्या अंतर्निहित वस्तु का चयन किया गया है, यदि ऐसा है, तो बस ड्रा करने योग्य संसाधन सेट करें जिसे आप पृष्ठभूमि के रूप में चाहते हैं (यह 9patch या जो भी हो)। सुनिश्चित करें कि आपका अडैप्टर इस बात से अवगत है और यह कहता है कि जब कुछ चुना गया है, तो वह अधिसूचितचैतन () को कॉल करता है।

        @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View rowView = convertView;
        if (rowView == null) {
            LayoutInflater inflater = act.getLayoutInflater();
            rowView = inflater.inflate(R.layout.slidemenu_listitem, null);
            MenuItemHolder viewHolder = new MenuItemHolder();
            viewHolder.label = (TextView) rowView.findViewById(R.id.slidemenu_item_label);
            viewHolder.icon = (ImageView) rowView.findViewById(R.id.slidemenu_item_icon);
            rowView.setTag(viewHolder);
        }
    
        MenuItemHolder holder = (MenuItemHolder) rowView.getTag();
        String s = items[position].label;
        holder.label.setText(s);
        holder.icon.setImageDrawable(items[position].icon);
    
        //Here comes the magic
        rowView.setSelected(items[position].selected);
    
        rowView.setBackgroundResource((rowView.isSelected()) ? R.drawable.slidemenu_item_background_selected : R.drawable.slidemenu_item_background);
    
        return rowView;
    }

यह वास्तव में अच्छा होगा यदि चयनकर्ता वास्तव में काम करेंगे, सिद्धांत रूप में यह एक अच्छा और सुरुचिपूर्ण समाधान है, लेकिन ऐसा लगता है कि यह टूट गया है। चुम्मा।


मैं इस समाधान की कोशिश करना चाहता हूं, क्या आप कृपया अधिक विवरण स्पष्टीकरण या पूर्ण समाधान दे सकते हैं? साभार
एंड्रयू लैम
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.