17

पहचान पर बड़ा है: एंड्रॉयड 6.0.1 की नई रिलीज के साथस्पिनर आंतरिक गद्दी एंड्रॉयड 6.0.1

, एंड्रॉयड की तरह लगता है क्योंकि डिफ़ॉल्ट रूप से स्पिनर घटक पर कुछ परिवर्तन, चारों ओर भीतरी गद्दी बनाया नीचे गाजर थोड़ा बड़ा है।

मैंने इसे एक ऐप पर देखा जहां मैंने कोड में कुछ भी संशोधित नहीं किया है, लेकिन बस डिवाइस पर ओएस अपडेट किया है और फिर भी स्पिनरों के अलग-अलग आकार हैं।

स्थिति:

मैं है 2 स्पिनरों एक एक RelativeLayout में दूसरे के बगल में (घटकों के बाकी बात नहीं, मैं सब कुछ जोड़ा है ताकि आप लेआउट के इस हिस्से देख सकते हैं - हटाया पूरी तरह से अनावश्यक गुण

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:orientation="horizontal" 
    android:paddingLeft="8dp" 
    android:paddingRight="8dp"> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="1" 
     android:ellipsize="end" 
     android:gravity="center_vertical" 
     android:singleLine="true" 
     tools:text="Test" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="match_parent" 
     android:layout_weight="0" 
     android:gravity="center" 
     android:paddingLeft="4dp" 
     android:singleLine="true" 
     android:textColor="@color/text_primary" 
     android:textSize="@dimen/text_size_body" 
     tools:ignore="RtlHardcoded,RtlSymmetry" 
     tools:text="7%" /> 
</LinearLayout> 
: या दृश्य आईडी)

<RelativeLayout 
    android:id="@+id/header" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content"> 

    <LinearLayout 
     android:id="@+id/container_for_buttons_on_the_right" 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true"> 

     <!-- Buttons here--> 
    </LinearLayout> 

    <android.support.v7.widget.AppCompatSpinner 
     android:id="@+id/spinner_1" 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" /> 

    <ViewSwitcher 
     android:id="@+id/spinner_switch" 
     android:layout_width="wrap_content" 
     android:layout_height="48dp" 
     android:layout_toEndOf="@id/spinner_1" 
     android:layout_toLeftOf="@id/container_for_buttons_on_the_right" 
     android:layout_toRightOf="@id/spinner_1" 
     android:layout_toStartOf="@id/container_for_buttons_on_the_right" 
     android:inAnimation="@anim/fade_in" 
     android:outAnimation="@anim/fade_out"> 

     <android.support.v7.widget.AppCompatSpinner 
      android:layout_width="wrap_content" 
      android:layout_height="match_parent" /> 

     <ImageView 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" /> 
     <!-- ImageView properties are incomplete but I need it there.--> 
    </ViewSwitcher> 
</RelativeLayout> 

getView() विधि के लिए स्पिनर अनुकूलक द्वारा इस्तेमाल किया लेआउट यह है

एक उदाहरण प्रस्तुत किया:

स्क्रीनशॉट 2 अलग स्क्रीनशॉट लिया की संयुक्त है:

  1. ऊपर एक एक नेक्सस 5 पर Android 6.0
  2. चल डिवाइस पर लिया जाता है नीचे एक नेक्सस 5 डिवाइस पर भी लिया गया है लेकिन पर चल रहा है एंड्रॉइड 6.0.1

screenshot

  • संपादित करें 1

समर्थन पुस्तकालय से AppCompatSpinner का उपयोग करते हुए व्यवहार नहीं बदलता है। समर्थित लाइब्रेरी संस्करण 23.1.1

+0

लहर प्रभाव को प्रदर्शित करते समय हमें एक बग से बचने के लिए नीचे की देखभाल के आसपास और पैडिंग जोड़ना पड़ा। यदि आपको निरंतर आकार की आवश्यकता है, तो पृष्ठभूमि को फ्रेमवर्क से कॉपी करें और इसका उपयोग करें, या AppCompat का उपयोग करें। – alanv

+0

मैं AppCompat का उपयोग करता हूं :)। क्या आप मुझे बता सकते हैं कि उस पैडिंग का सटीक आयाम क्या है? मुझे लगता है कि यह लगभग 8 या 10 है? – Mike

+0

यह 12 पीपी अंत पैडिंग और एक स्थिर 48 डीपी अंत-संरेखित अंतर है, जो प्रभावी ढंग से 12 डीपी शुरू पैडिंग है। आप सीधे प्लेटफ़ॉर्म/एंड्रॉइड -23/डेटा/res/drawable/spinner_background_material.xml' के तहत एंड्रॉइड एसडीके निर्देशिका में जांच सकते हैं। – alanv

उत्तर

7

कम से कम प्रयास के साथ मैं स्पिनर के लिए कस्टम पृष्ठभूमि बनाकर इसे ठीक करने में सक्षम था।

1. पहले एक drawable फ़ोल्डर में चला जाता है और इस तरह दिखता है, spinner_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:opacity="transparent"> 
    <item 
     android:width="24dp" 
     android:height="24dp" 
     android:drawable="@drawable/selector_background_borderless" 
     android:gravity="end|center_vertical" /> 
    <item android:drawable="@drawable/bg_spinner_anchor" /> 
</layer-list> 

AppCompatSpinner का उपयोग करते हुए मैं पृष्ठभूमि के लिए 2 xmls बनाने के लिए, चलो इस spinner_background.xml कॉल किया था

जहां selector_background_borderless एक सादा चयनकर्ता है (मैंने आपको आवश्यक न्यूनतम आइटम जोड़े हैं, तो आप v21 + के लिए इसका लहर विकल्प खोज सकते हैं।वास्तव में मैं ऐसा करने के लिए) आप की सिफारिश करेंगे:

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

और bg_spinner_anchor कैरट के लिए एक 9patch पीएनजी है। bg_spinner_anchor

2. दूसरा एक drawable-v23 फ़ोल्डर में चला जाता ठीक से तरंग समर्थन करने के लिए और इस तरह दिखता है, spinner_background.xml:

<?xml version="1.0" encoding="utf-8"?> 
<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
    android:paddingEnd="16dp" 
    android:paddingLeft="0dp" 
    android:paddingMode="stack" 
    android:paddingRight="0dp" 
    android:paddingStart="0dp"> 
    <item 
     android:width="24dp" 
     android:height="24dp" 
     android:drawable="@drawable/selector_background_borderless" 
     android:gravity="end|center_vertical" /> 

    <item 
     android:width="24dp" 
     android:height="24dp" 
     android:drawable="@drawable/ic_spinner_caret" 
     android:gravity="end|center_vertical" /> 
</layer-list> 

कहाँ ic_spinner_caret एंड्रॉयड स्रोत से इस्तेमाल किया एक वेक्टर है मैं इन परिसंपत्तियों का इस्तेमाल किया कोड इस तरह दिख रहा है। आप यह भी जोड़ना चाहिए अपने drawable-v23 फ़ोल्डर से जोड़ें:

<?xml version="1.0" encoding="utf-8"?> 
<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:width="24dp" 
    android:height="24dp" 
    android:viewportWidth="24.0" 
    android:viewportHeight="24.0" 
    android:tint="?attr/colorControlNormal"> 
    <path 
     android:pathData="M7,10l5,5,5-5z" 
     android:fillColor="#524e4a"/> 
</vector> 

क्रेडिट मार्गदर्शन के लिए एंड्रॉयड यूआई टूलकिट से alanv के पास जाओ!

+1

'bg_spinner_assets' के लिए लिंक 'Backstreet_Boys' एमपी 3 फ़ाइल डाउनलोड करने के लिए रीडायरेक्ट कर रहे हैं। क्या आप इसे देख सकते हैं? धन्यवाद –

+0

मुझे बताएं कि मेरा जिथब लिंक काम करता है या नहीं। – Mike

+0

लिंक अब काम कर रहा है। धन्यवाद। –

3

मेरे पास एक ही समस्या थी और मेरी योजना रोलबैक केवल v23 के लिए 6.0.1 अद्यतन थी।

===

  1. सुनिश्चित करें कि आपके Spinner एक शैली इसे से जुड़ी है। नीचे दिए गए उदाहरण में Widget.Spinner के रूप में नामित उदाहरण शैली के लिए:
<Spinner 
    android:id="@+id/spinner_1" 
    style="@style/Widget.Spinner" 
    android:layout_width="64dp" 
    android:layout_height="64dp"/> 
  1. values-v23 निर्देशिका के अंतर्गत बनाएं (यदि पहले से ही मौजूद नहीं है) styles.xml (परिवर्तन एपीआई v23 केवल करने के लिए लागू किया जाएगा के लिए)। उदाहरण के लिए, नीचे Widget.Spinner शैली परिभाषा उदाहरण देखें:
<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <style name="Widget.Spinner" parent="Widget.AppCompat.Spinner"> 
     <item name="android:background">@drawable/spinner_background_material</item> 
    </style> 
</resources> 

शैली की मूल Widget.AppCompat.Spinner है और यह पुनर्परिभाषित यह एक 6.0.1 स्रोत से वापस रोलिंग हम हो जाएगा के साथ android:background है।

ध्यान दें, कि आप अन्य संस्करणों भी लक्षित कर रहे हैं, तो आप प्रवेश

<style name="Widget.Spinner" parent="Widget.AppCompat.Spinner"/> 

के लिए यह आसान है अलग लेआउट एक्सएमएल के बजाय एक और सामान्य शैली को परिभाषित करने के साथ values निर्देशिका के अंतर्गत एक डिफ़ॉल्ट styles.xml जोड़ने की आवश्यकता होगी फ़ाइलों और आपकी परियोजना में values निर्देशिका के तहत एक सामान्य styles.xml होना चाहिए, है ना? :)

  1. https://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/drawable/ से spinner_background_material.xml में ले आओ। इसे फिर से drawable-v23 के तहत सहेजें, हम केवल यह सुनिश्चित करेंगे कि हम केवल API v23 बदल रहे हैं।

फ़ाइल की सामान्य सामग्री है:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" 
     android:paddingMode="stack" 
     android:paddingStart="0dp" 
     android:paddingEnd="48dp" 
     android:paddingLeft="0dp" 
     android:paddingRight="0dp"> 
<item 
    android:gravity="end|fill_vertical" 
    android:width="48dp" 
    android:drawable="@drawable/control_background_40dp_material" /> 
<item 
    android:drawable="@drawable/ic_spinner_caret" 
    android:gravity="end|center_vertical" 
    android:width="24dp" 
    android:height="24dp" 
    android:end="12dp" /> 
</layer-list> 

अब, इस फाइल को आप परिवर्तित करना चाहते हो सकता है।मैं कैरट स्थिति में सुधार करने के लिए इस फ़ाइल में परिवर्तन किए: हटाया दूसरे मद के android:end विशेषता
क) सेट layer-list के android:paddingEnd बराबर 0dp
ख) आधा पहले आइटम के android:width24dp
को ग)

परिवर्तन ने अपने पक्षों को अलग करके पृष्ठभूमि पतला बनाया, लेकिन दृष्टिकोण ने लहर प्रभाव को बरकरार रखा। यदि आवश्यक हो तो अपने खुद के कस्टम मूल्यों के साथ खेलने के लिए स्वतंत्र महसूस करें।

  1. उपरोक्त परिवर्तन संकलित नहीं होंगे क्योंकि अधिक फ़ाइलों को लाने के लिए आवश्यक है क्योंकि उन्हें उपरोक्त फ़ाइलों द्वारा reffered किया जाएगा।

drawable-v23 में डाउनलोड करें (ऊपर लिंक देखें):
क) control_background_40dp_material.xml
ख) ic_spinner_caret.xml

color-v23 में डाउनलोड करें:
क) control_highlight_material.xmlhttps://android.googlesource.com/platform/frameworks/base.git/+/android-6.0.1_r3/core/res/res/color/ से (इस फ़ाइल शायद drawable-v23 के तहत निवास कर सकते हैं भी, लेकिन अब के लिए मूल स्रोत स्थानों के पैटर्न का पालन करें)। ध्यान दें, यदि आप एक का उपयोग करें :) यदि नहीं, तो आप इसे से मूल्य है reffer कर सकते हैं कि फाइल की @dimen/highlight_alpha_material_coloredappcompat-v7 से उठाया जाता है,:

<item format="float" name="highlight_alpha_material_colored" type="dimen">0.26</item> 

===

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

+0

विस्तृत उत्तर के लिए धन्यवाद। काम करता है! –

+0

इस स्वेनु पोस्ट करने के लिए धन्यवाद। आपने मुझे उपयोगी स्पष्टीकरण के साथ समय का एक गुच्छा बचाया! दूसरे विचार पर – JPM

+0

। यह कैरेट छुपाने की कोशिश करते समय एपीआई 24 पर अच्छा काम नहीं करता है। – JPM

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