स्पिनर के ड्रॉपडाउन के लिए मैं एक अलग विषय कैसे निर्धारित करूं?


102

एक उदाहरण का उपयोग:

यहां छवि विवरण दर्ज करें

स्पिनर डार्क थीम्ड है, लेकिन मैं चाहता हूं कि ड्रॉपडाउन हल्के थीम वाला हो।

जवाबों:


195

एंड्रॉयड मीटर

एंड्रॉइड 6.0 में नया, स्पिनर में अब android:popupThemeपैरामीटर है जो आपको पॉपअप (ड्रॉपडाउन) के लिए उपयोग किए जाने वाले थीम को सेट करने की अनुमति देता है।

आप इसका उपयोग इस प्रकार कर सकते हैं:

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    android:popupTheme="@android:style/ThemeOverlay.Material.Light" />

यह एपीआई स्तर 23+ पर चलने वाले उपकरणों पर काम करेगा, लेकिन Android के निचले संस्करण को चलाने वाले उपकरणों पर नहीं।

AppCompat

यह वह जगह है जहां AppCompat आता है। इसका स्पिनर कार्यान्वयन भी समर्थन करता है popupTheme, लेकिन यह सही पाने के लिए थोड़ा अधिक शामिल है।

<Spinner
    android:layout_height="wrap_content"
    android:layout_width="match_parent"
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" />

उसके बाद, आपको AppCompat के साथ काम करने में सक्षम होने के लिए अपने एडॉप्टर को अपडेट करना होगा। आप इसे नया ThemedSpinnerAdapterइंटरफ़ेस लागू करके बनाते हैं ।

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {

   Theme getDropDownViewTheme() { ... }

   void setDropDownViewTheme(Theme theme) { ... }

}

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

इसका मतलब यह है कि आपका एडॉप्टर कुछ इस तरह बन जाता है:

public class MyAdapter extends BaseAdapter implements ThemedSpinnerAdapter {
  private final ThemedSpinnerAdapter.Helper mDropDownHelper;

  public MyAdapter(Context context) { 
    mDropDownHelper = new ThemedSpinnerAdapter.Helper(context);
  }

  @Override
  public View getDropDownView(int position, View convertView, ViewGroup parent) {
    View view;

    if (convertView == null) {
      // Inflate the drop down using the helper's LayoutInflater
      LayoutInflater inflater = mDropDownHelper.getDropDownViewInflater();
      view = inflater.inflate(R.layout.my_dropdown, parent, false);
    }

    // ...

    return view;
  }

  @Override
  public void setDropDownViewTheme(Theme theme) {
    mDropDownHelper.setDropDownViewTheme(theme);
  }

  @Override
  public Theme getDropDownViewTheme() {
    return mDropDownHelper.getDropDownViewTheme();
  }
}

नमस्ते, मैं appcompat-v7 के अंदर ThemedSpinnerAdapter नहीं ढूँढ सका। मैं 22.2.1 संस्करण का उपयोग कर रहा हूं। क्या मुझे इसे आयात करने के लिए कुछ अलग करना होगा?
डगलस ने

3
@DouglasAlves नवीनतम 23.0.0
kususrav

ऐसा लगता है कि एंड्रॉइड स्टूडियो ऐप के बारे में नहीं जानता है: पॉपअपथीम स्पिनर विशेषता: "अनपेक्षित नामस्थान उपसर्ग" ऐप "टैग स्पिनर के लिए मिला"। लिंट भी उसी त्रुटि के साथ विफल हो जाती है।
२०:४० पर makovkastar

1
@ क्रिस बैन्स: यह एक डार्क बैकग्राउंड के साथ ड्रॉप डाउन लिस्ट देता है, चाहे आप जिस भी थीम का इस्तेमाल करें।
अश्विन

2
क्या इसे xml में "स्पिनर" के बजाय "android.support.v7.widget.AppCompatSpinner" का उपयोग करना चाहिए?
एंजेल कोह

2

स्पिनर के तीर के लिए मैंने इसका उपयोग android:backgroundTint="@color/white"एपीआई 21 से किया है

स्पिनर दृश्य और ड्रॉपडाउन दृश्य के लिए:

ArrayAdapter<Area> areasAdapter = new ArrayAdapter<Area>(getContext(),R.layout.spinner_item, areas);

areasAdapter.setDropDownViewResource(R.layout.dropdwon_item);
areasSpinner.setAdapter(areasAdapter);

के लिए getView () एडाप्टर spinner_item.xml का उपयोग करेगा

के लिए getDropDownView () एडाप्टर dropdwon_item.xml का उपयोग करेगा

फिर आप अपनी पसंद के लेआउट का उपयोग कर सकते हैं

आशा करता हूँ की ये काम करेगा


0

यदि आप CursorAdapterअपने कार्यान्वयन का उपयोग करते हैं तो संदर्भ के लिए बहुत आसान हो सकता है, बस ओवरराइड करें newView(), getDropDownView()वहां ओवरराइड करने की कोई आवश्यकता नहीं है।

@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
    return mDropDownHelper.getDropDownViewInflater().inflate(R.layout.list_item, parent, false);
}

-6

आप इसे आज़मा सकते हैं: अपने लेआउट फ़ोल्डर में एक spinner_item.xml बनाएं:

<TextView 
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
android:padding="10dp"
android:background = "#ffffff"
android:textColor="@color/primary_text"
android:textSize="@dimen/text_size_normal" />

फिर इस कोड का उपयोग करें:

spinnerAdapter = new ArrayAdapter<String>(R.layout.spinner_item,items);

6
मुझे लगता है कि यह काफी स्पष्ट है क्योंकि यह सवाल का जवाब नहीं देता है। सवाल एक विषय स्थापित करने के बारे में है, मुझे इस उत्तर में थीमिंग का कोई संदर्भ नहीं दिखता है। बस इसलिए हम स्पष्ट हैं, मैंने इसे कम नहीं किया है, अन्य लोग पहले से ही इस पर चले गए हैं।
2Dee
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.