2011-01-19 17 views
13

एसओ पर यहां कई संबंधित प्रश्नों को पढ़ा है, साथ ही एंड्रॉइड डॉक्स और स्रोत को देखने के लिए इसे देखने का प्रयास किया है, लेकिन मैं स्टंप हूं, हालांकि यह दिया गया है कि listSelector, केवल चयनित आइटम पर शैलियाँ लागू करने लगता है मैं हैरान नहीं हूँ ...एंड्रॉइड लिस्ट व्यू स्टेट लिस्ट डिफॉल्ट आइटम पृष्ठभूमि नहीं दिखा रहा है

मैं सूचीदृश्य यहाँ main.xml में परिभाषित किया है:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fadingEdgeLength="5dp" 
    android:divider="#000000" 
     android:dividerHeight="1dp" 
     android:listSelector="@drawable/list_selector" /> 
    <TextView 
    android:id="@android:id/empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:singleLine="false" 
     android:text="@string/message_list_empty" /> 
</FrameLayout> 

listSelector संदर्भित यहाँ है (से बड़े पैमाने पर उधार ली गई एसडीके में मिली डिफ़ॉल्ट एंड्रॉइड स्टेट लिस्ट: /android/platforms/android-8/data/res/drawable/list_selector_background.xml):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- the window has lost focus, disable the items --> 
    <item 
     android:state_window_focused="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are disabled --> 
    <item 
     android:state_enabled="false" 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_disabled" /> 
    <item 
     android:state_enabled="false" 
     android:state_focused="true" 
     android:drawable="@drawable/shape_row_disabled" /> 
    <item 
     android:state_enabled="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are enabled and being pressed --> 
    <item 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_transition" /> 
    <item 
     android:state_focused="false" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_transition" /> 

    <!-- the list items are enabled and being used --> 
    <item 
     android:state_focused="true" 
     android:drawable="@drawable/shape_row_selected" /> 

    <!-- the default item --> 
    <item 
     android:drawable="@drawable/shape_row" /> 
</selector> 

ड्रॉएबल संदर्भित आकार, आयत, इसलिए की तरह हैं गोल:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
    <gradient 
     android:startColor="#EF6100" 
     android:centerColor="#FF8E00" 
     android:endColor="#EF6100" 
     android:angle="270" /> 
    <corners 
     android:bottomRightRadius="7dp" 
     android:bottomLeftRadius="7dp" 
     android:topLeftRadius="7dp" 
     android:topRightRadius="7dp" /> 
</shape> 

तो, अंतिम परिणाम डिफ़ॉल्ट रूप से एक @ drawable/shape_row पृष्ठभूमि के साथ आइटम के साथ एक ListView, और उसके बाद अलग-अलग होना चाहिए राज्य के आधार पर रंगीन पृष्ठभूमि। जब मैं अपनी सूची को फायर करता हूं, तब सबकुछ ठीक काम करता है जब राज्य सक्रिय होते हैं, जैसे कोई आइटम फोकस हो जाता है, दबाया जाता है, आदि, लेकिन जब कोई भी चयनित नहीं होता है तो आइटमों में स्वयं पारदर्शी पृष्ठभूमि होती है (यानी डिफ़ॉल्ट दृश्य स्थिति)। मैं आशा व्यक्त की थी कि राज्य सूची के अंतिम नियम,

<item android:drawable="@drawable/shape_row" /> 

है कि राज्य पर कब्जा होगा, लेकिन यह काम नहीं कर रहा किसी कारण से। मैंने चीजों को चारों ओर स्थानांतरित कर दिया है और विभिन्न सेटिंग्स की कोशिश की है, और कुछ भी नहीं। अगर मैं row.xml फ़ाइल को संपादित करता हूं जिसे मैं सूची दृश्य में सूची आइटम को परिभाषित करने के लिए उपयोग करता हूं और एक विशिष्ट एंड्रॉइड जोड़ने की कोशिश करता हूं: पृष्ठभूमि जो @ drawable/shape_row को इंगित करती है, प्रत्येक पंक्ति को सही पृष्ठभूमि मिलती है, लेकिन दबाए जाने पर, फोकस पर, आदि राज्यों को संसाधित करने में विफल रहता है (या कम से कम, पृष्ठभूमि के रूप में कभी नहीं बदला जा सकता है)।

क्या कोई मुझे सही दिशा में इंगित कर सकता है? मैं इसे बिस्तर पर रखने के लिए बहुत करीब हूं, लेकिन लगभग हर चीज की कोशिश करने के बाद, सिर्फ सूची दृश्य आइटम को डिफ़ॉल्ट पृष्ठभूमि लेने के लिए नहीं मिल सकता है और एंड्रॉइड के माध्यम से लागू राज्य सूची का जवाब दे सकता है: सूची चयनकर्ता।

धन्यवाद,

पॉल

संपादित करें: itemBackground = "@ drawable/shape_row" main.xml में ListView, और आश्चर्य नहीं भाग्य के लिए (डॉक्स:

इसके अलावा सिर्फ एंड्रॉयड जोड़ने की कोशिश की राज्य का उपयोग मेनू आइटम की पृष्ठभूमि निर्दिष्ट करने के लिए किया जाना चाहिए, लेकिन सोचा कि यह सूची वस्तुओं के साथ एक शॉट के लायक था)।

एक और चीज ने कोशिश की, एंड्रॉइड जोड़ना: प्रत्येक चयनकर्ता और आइटम परिभाषाओं के लिए दृश्यमान = "सत्य"। स्टेटलिस्ट ड्रेवेबल दस्तावेज़ इंगित करते हैं कि "Provides initial visibility state of the drawable; the default value is false", लेकिन यह जोड़ना कुछ भी नहीं बदला।

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

यहाँ सूची सेट पृष्ठभूमि के साथ कैसा दिखता है:

normal, unselected list with background set

कारण सेट पृष्ठभूमि करने के लिए, वहाँ उपस्थिति में कोई परिवर्तन नहीं है जब आइटम चयनित हैं। अगर मैं एंड्रॉयड बदलने के लिए: सही पर drawSelectorOnTop निर्देश और किसी आइटम का चयन, मैं मिलता है:

selected, with drawSelectorOnTop set to true

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

selected, no background

:, StateSelector के अंतिम नियम के रूप में कोई पृष्ठभूमि छवियों अर्थ कोई अच्छा कस्टम गोल आकार गैर चयनित आइटम के लिए (? यह एक सर्व-के रूप में कार्य नहीं होना चाहिए) का पालन किया जाना प्रतीत नहीं होता है देखते हैं

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

किसी और को जो में वजन कर सकते हैं के लिए धन्यवाद।

उत्तर

9

यह समझ से बाहर, मुद्दा, जबकि मैं android:listSelector="@drawable/list_selector" के माध्यम से सही ढंग से राज्य सूची के लिए ListView के लिए listSelector की स्थापना की गई थी, मैं भी android:background="@drawable/list_background"

के माध्यम से दूसरे राज्य सूची के लिए सूची आइटम के लिए पृष्ठभूमि सेट करने के लिए आवश्यक है कि था List_background में।एक्सएमएल राज्य सूची, मेरे पास है:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" 
android:visible="true"> 

    <!-- the list items are disabled --> 
<item 
     android:state_window_focused="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are enabled, in focus but not being touched/pressed (idle) --> 
    <item 
     android:state_window_focused="true" 
     android:state_pressed="false" 
     android:state_focused="false" 
     android:state_selected="false" 
     android:drawable="@drawable/shape_row" /> 

    <!-- the catch-all --> 
    <item 
     android:drawable="@android:color/transparent" /> 
</selector> 

यहाँ मिले जवाब:

Changing background color of ListView items on Android

मेरी सूची में ऊपर चयनकर्ता के साथ संयोजन के रूप में, यह पूरी तरह से काम करता है।

+0

दुर्भाग्यवश, मुझे अभी भी मेरी सूची दृश्य को अनुकूलित करने में समस्याएं आ रही हैं। मैंने यहां अपने विशिष्ट मुद्दों को पोस्ट किया: http://stackoverflow.com/questions/5426385/listview-with-nine-patch-item-background-issues; मैं आपके पास मौजूद किसी भी इनपुट की सराहना करता हूं। – LostNomad311

+1

इसके अलावा, अपने बीजी रंग में सूची विशेषता "कैश कॉलरहिंट" सेट करें। अन्यथा, आपकी सूची में एक त्वरित स्वाइप के परिणामस्वरूप काले वस्तुओं की सूची हो सकती है। – larham1

2

listSelector केवल एक View कि चयनित आइटम View वाले स्थान पर ही तैयार किया जाएगा निर्दिष्ट करने के लिए प्रयोग किया जाता है। यानी, listSelector प्रति ListView का केवल एक उदाहरण है। आप निर्दिष्ट कर सकते हैं कि यह शीर्ष पर खींचा जा सकता है या drawSelectorOnTop का उपयोग नहीं कर सकता है।

यदि आप राज्य सूची का उपयोग करने के लिए अपने सभी View एस चाहते हैं तो आपको यह निर्दिष्ट करना चाहिए कि बच्चे View एस को परिभाषित किया गया है।

मैं संदर्भ के रूप में AbsListView के लिए स्रोत का उपयोग कर रहा हूं। विशेष रूप से AbsListView#setSelector(Drawable), AbsListView#positionSelector, AbsListView#drawSelector, और AbsListView#dispatchDraw

AbsListView#drawSelector:

private void drawSelector(Canvas canvas) { 
     if (shouldShowSelector() && mSelectorRect != null && !mSelectorRect.isEmpty()) { 
      final Drawable selector = mSelector; 
      selector.setBounds(mSelectorRect); 
      selector.draw(canvas); 
     } 
} 

AbsListView#positionSelector:

void positionSelector(View sel) { 
    final Rect selectorRect = mSelectorRect; 
    selectorRect.set(sel.getLeft(), sel.getTop(), sel.getRight(), sel.getBottom()); 
    positionSelector(selectorRect.left, selectorRect.top, selectorRect.right, 
      selectorRect.bottom); 

    final boolean isChildViewEnabled = mIsChildViewEnabled; 
    if (sel.isEnabled() != isChildViewEnabled) { 
     mIsChildViewEnabled = !isChildViewEnabled; 
     refreshDrawableState(); 
    } 
} 

स्रोत की ओर संकेत है कि वहाँ केवल एक ही mSelector इस्तेमाल किया बनाया/और उस में रखा जाता है कि आइटम के रूप में एक ही बाध्यकारी आयत।

+0

सभी कड़ी मेहनत के लिए धन्यवाद! जब आप सूची का चयन करते हैं चयनकर्ता प्रति सूची केवल एक बार उपयोग किया जा रहा है, तो मैं इसे ListView XML में निर्दिष्ट कर रहा हूं। चयन करने के लिए प्रत्येक व्यक्तिगत सूची आइटम (वे टेक्स्ट व्यूज़) सेट करना है इसका मतलब है कि सूची चयनकर्ता छिप जाता है ... कोई पृष्ठभूमि का अर्थ प्रत्येक पाठ दृश्य के लिए एक पारदर्शी पृष्ठभूमि का चयन नहीं करता है जब तक कि चयनकर्ता न हो। मैंने ListView के लिए drawSelectorOnTop निर्देश का उपयोग करने का प्रयास किया, और यह उसमें काम किया है, मैं पृष्ठभूमि पर चयनकर्ता देख सकता हूं, लेकिन यह टेक्स्टव्यू की सामग्री को अस्पष्ट करने के लिए अग्रभूमि पर भी है। –

+0

हो सकता है कि कस्टम (मेरे मामले में, गोलाकार) सूची दृश्य आइटम और उचित चयनकर्ता व्यवहार हो सकता है ... शायद मुझे संपूर्ण सूची दृश्य के लिए पृष्ठभूमि निर्दिष्ट करने की आवश्यकता है, एक रंग कहें, और फिर चयनकर्ता ठीक से प्रदर्शित होंगे । सूची दृश्य आइटम और चयनकर्ता बातचीत को गोल करने की उम्मीद कर रहा था, लेकिन शायद यह संभव नहीं है। –

0

आप रूट लेआउट और बच्चे के लिए selector_background के लिए डिफ़ॉल्ट पृष्ठभूमि असाइन कर सकते हैं, इस मामले में यदि आइटम नहीं चुना गया है तो डिफ़ॉल्ट पृष्ठभूमि चयनकर्ता को अस्पष्ट नहीं करती है। मेरे लिए यह काम

संबंधित मुद्दे