पहचान
दुर्भाग्य से सेट करने का कोई तरीका नहीं है SearchView
एक्सएमएल में थीम, स्टाइल और इनहेरिटेंस का उपयोग करके टेक्स्ट फील्ड स्टाइल जैसा कि आप एक्शनबॉडी ड्रॉपडाउन में आइटम की पृष्ठभूमि के साथ कर सकते हैं । ऐसा इसलिए है क्योंकि selectableItemBackground
इसे शैलीगत रूप में सूचीबद्ध किया गया है R.stylable
, जबकि searchViewTextField
(विषय विशेषता जिसे हम रुचि रखते हैं) नहीं है। इस प्रकार, हम इसे XML संसाधनों से आसानी से एक्सेस नहीं कर सकते (आपको एक No resource found that matches the given name: attr 'android:searchViewTextField'
त्रुटि मिलेगी )।
कोड से SearchView टेक्स्ट फील्ड बैकग्राउंड सेट करना
इसलिए, SearchView
टेक्स्ट फ़ील्ड की पृष्ठभूमि को ठीक से बदलने का एकमात्र तरीका इंटर्नल्स में प्रवेश करना है, यह देखने के लिए एक्सेस प्राप्त करना है कि पृष्ठभूमि पर आधारित है searchViewTextField
और हमारा अपना सेट है।
ध्यान दें: समाधान नीचे android:id/search_plate
तत्व के केवल आईडी ( ) पर निर्भर करता है SearchView
, इसलिए यह बच्चों के ट्रैवर्सल की तुलना में एसडीके-संस्करण से अधिक स्वतंत्र है (जैसे searchView.getChildAt(0)
कि भीतर सही दृश्य प्राप्त करने के लिए उपयोग करना SearchView
), लेकिन यह बुलेट-प्रूफ नहीं है। विशेष रूप से अगर कुछ निर्माता आंतरिक SearchView
और तत्व को फिर से लागू करने का निर्णय लेते हैं, तो उपर्युक्त आईडी मौजूद नहीं है - कोड काम नहीं करेगा।
एसडीके में, पाठ क्षेत्र की पृष्ठभूमि नौ-पैच केSearchView
माध्यम से घोषित की गई है , इसलिए हम इसे उसी तरह करेंगे। आप Android git रिपॉजिटरी की ड्रॉबल-mdpi निर्देशिका में मूल png चित्र पा सकते हैं । हम दो छवि में रुचि रखते हैं। राज्य के लिए एक जब पाठ क्षेत्र का चयन किया जाता है (जिसका नाम textfield_search_selected_holo_light.9.png है ) और एक जहाँ यह नहीं है ( textfield_search_default_holo_light.9.png नाम )।
दुर्भाग्य से, आपको दोनों छवियों की स्थानीय प्रतियां बनानी होंगी, भले ही आप केवल केंद्रित स्थिति को अनुकूलित करना चाहते हों । ऐसा इसलिए है क्योंकि R.rectabletextfield_search_default_holo_light
में मौजूद नहीं है । इस प्रकार यह आसानी से सुलभ नहीं है , जिसका उपयोग स्थानीय ड्रॉबल को संदर्भित करने के बजाय नीचे दिखाए गए चयनकर्ता में किया जा सकता है।@android:drawable/textfield_search_default_holo_light
नोट: मैं आधार के रूप में होलो लाइट थीम का उपयोग कर रहा था , लेकिन आप होलो डार्क के साथ भी ऐसा कर सकते हैं । ऐसा लगता है कि प्रकाश और अंधेरे विषयों के बीच चयनित 9-पैच में कोई वास्तविक अंतर नहीं है । हालाँकि, डिफ़ॉल्ट स्थिति के लिए 9-पैच में अंतर है (देखें लाइट बनाम डार्क )। इसलिए, शायद डार्क के लिए, चयनित राज्य के लिए 9-पैच की स्थानीय प्रतियां बनाने की कोई आवश्यकता नहीं है और लाइट विषयों (यह मानते हुए कि आप दोनों को संभालने के लिए चाहते हैं, और उन दोनों को देखने में के रूप में ही बनाने के Holo थीम )। बस एक स्थानीय प्रतिलिपि बनाएँ और इसका उपयोग करेंदोनों विषयों के लिए चयनकर्ता ।
अब, आपको अपनी आवश्यकता के लिए डाउनलोड किए गए नौ-पैच को संपादित करने की आवश्यकता होगी (अर्थात नीला रंग लाल एक में बदलना)। यदि यह आपके संपादन के बाद सही ढंग से परिभाषित किया गया है, तो यह जांचने के लिए आप ड्रा 9-पैच टूल का उपयोग करके फाइल देख सकते हैं ।
मैंने एक-पिक्सेल पेंसिल टूल (बहुत आसान) के साथ GIMP का उपयोग करके फ़ाइलों को संपादित किया है, लेकिन आप शायद अपने खुद के उपकरण का उपयोग करेंगे। यहाँ ध्यान केंद्रित राज्य के लिए मेरा अनुकूलित 9-पैच है :
नोट: सादगी के लिए, मैंने केवल mdpi घनत्व के लिए छवियों का उपयोग किया है । यदि आप किसी भी डिवाइस पर सबसे अच्छा परिणाम चाहते हैं, तो आपको कई स्क्रीन घनत्व के लिए 9-पैच बनाने होंगे । होलो के लिए चित्र mdpi , hdpi और SearchView
में पाए जा सकते हैं xhdpi ।
अब, हमें ड्रॉ करने योग्य चयनकर्ता बनाने की आवश्यकता होगी, ताकि दृश्य स्थिति के आधार पर उचित छवि प्रदर्शित हो। res/drawable/texfield_searchview_holo_light.xml
निम्नलिखित सामग्री के साथ फ़ाइल बनाएँ :
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="true"
android:drawable="@drawable/textfield_search_selected_holo_light" />
<item android:drawable="@drawable/textfield_search_default_holo_light" />
</selector>
हम उपर्युक्त बनाए गए ड्रॉबल का उपयोग उस LinearLayout
दृश्य के लिए पृष्ठभूमि सेट करने के लिए करेंगे जो टेक्स्ट फ़ील्ड को SearchView
अपने भीतर रखता है - इसकी आईडी है android:id/search_plate
। तो यहाँ विकल्प कोड बनाते समय कोड में जल्दी से कैसे करें:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.activity_main, menu);
// Getting SearchView from XML layout by id defined there - my_search_view in this case
SearchView searchView = (SearchView) menu.findItem(R.id.my_search_view).getActionView();
// Getting id for 'search_plate' - the id is part of generate R file,
// so we have to get id on runtime.
int searchPlateId = searchView.getContext().getResources().getIdentifier("android:id/search_plate", null, null);
// Getting the 'search_plate' LinearLayout.
View searchPlate = searchView.findViewById(searchPlateId);
// Setting background of 'search_plate' to earlier defined drawable.
searchPlate.setBackgroundResource(R.drawable.textfield_searchview_holo_light);
return super.onCreateOptionsMenu(menu);
}
}
अंतिम प्रभाव
यहां देखें अंतिम परिणाम का स्क्रीनशॉट:
मुझे यह कैसे मिला
मुझे लगता है कि यह इस बात पर ध्यान देने योग्य है कि मुझे यह कैसे मिला, ताकि अन्य दृष्टिकोणों को अनुकूलित करते समय इस दृष्टिकोण का उपयोग किया जा सके।
दृश्य लेआउट की जाँच करना
मैंने जाँच की है कि SearchView
लेआउट कैसा दिखता है। में SearchView contructor एक एक लाइन है कि फुलाते लेआउट पा सकते हैं:
inflater.inflate(R.layout.search_view, this, true);
अब हम जानते हैं कि SearchView
लेआउट फ़ाइल नाम में है res/layout/search_view.xml
। Search_view.xml में देखने पर हम एक आंतरिक LinearLayout
तत्व (आईडी के साथ search_plate
) पा सकते हैं, जो इसके android.widget.SearchView$SearchAutoComplete
अंदर है (हमारी खोज दृश्य क्षेत्र फ़ील्ड जैसा दिखता है):
<LinearLayout
android:id="@+id/search_plate"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center_vertical"
android:orientation="horizontal"
android:background="?android:attr/searchViewTextField">
अब, अब हम पृष्ठभूमि को वर्तमान थीम की searchViewTextField
विशेषता के आधार पर सेट करते हैं ।
जांच विशेषता (क्या यह आसानी से निपटाने योग्य है?)
यह देखने के लिए कि searchViewTextField
विशेषता कैसे सेट की जाती है, हम Res / मान / themes.xml की जांच करते हैं । SearchView
डिफ़ॉल्ट में संबंधित विशेषताओं का एक समूह है Theme
:
<style name="Theme">
<!-- (...other attributes present here...) -->
<!-- SearchView attributes -->
<item name="searchDropdownBackground">@android:drawable/spinner_dropdown_background</item>
<item name="searchViewTextField">@drawable/textfield_searchview_holo_dark</item>
<item name="searchViewTextFieldRight">@drawable/textfield_searchview_right_holo_dark</item>
<item name="searchViewCloseIcon">@android:drawable/ic_clear</item>
<item name="searchViewSearchIcon">@android:drawable/ic_search</item>
<item name="searchViewGoIcon">@android:drawable/ic_go</item>
<item name="searchViewVoiceIcon">@android:drawable/ic_voice_search</item>
<item name="searchViewEditQuery">@android:drawable/ic_commit_search_api_holo_dark</item>
<item name="searchViewEditQueryBackground">?attr/selectableItemBackground</item>
हम देखते हैं कि डिफ़ॉल्ट विषय के लिए मूल्य है @drawable/textfield_searchview_holo_dark
। के लिए Theme.Light
मूल्य भी है कि फाइल में सेट है ।
अब, यह महान होगा यदि यह विशेषता R.styleable के माध्यम से सुलभ थी , लेकिन, दुर्भाग्य से यह नहीं है। तुलना के लिए, दूसरे को देख विषय गुण जिसमें दोनों मौजूद हैं themes.xml और R.attr तरह textAppearance या selectableItemBackground । अगर XML में हमारे पूरे एप्लिकेशन के लिए थीम को परिभाषित करते समय (और ) हम searchViewTextField
मौजूद थे, तो हम अपने ड्रॉबल सेलेक्टर का उपयोग कर सकते थे। उदाहरण के लिए:R.attr
R.stylable
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<style name="AppTheme" parent="android:Theme.Light">
<item name="android:searchViewTextField">@drawable/textfield_searchview_holo_light</item>
</style>
</resources>
क्या संशोधित किया जाना चाहिए?
अब हम जानते हैं, कि हमें search_plate
कोड के माध्यम से पहुँचना होगा। हालाँकि, हम अभी भी नहीं जानते कि यह कैसा दिखना चाहिए। संक्षेप में, हम डिफ़ॉल्ट विषयों में मान के रूप में उपयोग किए जाने वाले ड्राबेल्स की खोज करते हैं: textfield_searchview_holo_dark.xml और textfield_searchview_holo_light.xml । कंटेंट को देखते हुए हम देखते हैं कि ड्रॉबल selector
व्यू स्टेट के आधार पर दो अन्य ड्रॉबल्स (जो बाद में 9-पैच होते हैं) के संदर्भ में होता है। आप पर (लगभग) सभी Android के वर्ज़न से 9-पैच ड्रॉएबल एकत्रित किया पा सकते हैं androiddrawables.com
अनुकूलित
हम 9-पैच में से एक में नीली रेखा को पहचानते हैं , इसलिए हम इसकी स्थानीय प्रति बनाते हैं और इच्छानुसार रंग बदलते हैं।