दिलचस्प पोस्ट
पांडा: मैं कॉलम में कई पंक्तियों में पाठ कैसे विभाजित करूं? LD_PRELOAD तंत्र का उपयोग करके 'malloc' ओवरराइड करना User.Identity के उपलब्ध गुणों का विस्तार कैसे करें MySQL मामले संवेदनशील क्वेरी कैसे पीएनजी छवि के रूप में कैनवास को बचाने के लिए? जावा में गणित अभिव्यक्ति के मूल्यांकन के लिए विधि कैसे मैथ। पोव () को एनएटी फ्रेमवर्क में लागू किया जाता है? सी या सी ++ में आप स्ट्रिंग को कैसे बदलते हैं? पाइप के साथ "टी" का उपयोग करते समय मैं एक फ़ाइल में stderr कैसे लिख सकता हूँ? स्ट्रैक्ट्स के 2 डी सरणी को पास करना ट्यूपल तुलना पायथन में कैसे काम करता है? औसत चल रहा है या मतलब चल रहा है style.display = 'none' क्रोम में विकल्प टैग पर काम नहीं करता है, लेकिन यह फ़ायरफ़ॉक्स में है सी # वर्गों और सदस्यों (क्षेत्रों, विधियों, आदि) के लिए डिफ़ॉल्ट दृश्यता? हो सकता है कि एक से वापसी पर ऑपरेटिंग जिसमें "बस"

खोजदृश्य विजेट की पृष्ठभूमि को बदलने योग्य बनाना

मैं ड्रॉएबल को बदलने की कोशिश कर रहा हूं जो कि एंड्रॉइड एक्शनबार खोजदृश्य विजेट में है।

वर्तमान में यह इस तरह दिखता है: यहां छवि विवरण दर्ज करें

लेकिन मुझे नीले रंग की पृष्ठभूमि को लाल रंग में चित्रित करना होगा।

मैंने अपने स्वयं के खोज विजेट को रोल करने से बहुत सी बातें करने की कोशिश की है, लेकिन कुछ भी काम नहीं कर रहा है

क्या कोई मुझे इसे बदलने के लिए सही दिशा में बता सकता है?

वेब के समाधान से एकत्रित समाधान "खोजदृश्य विजेट की पृष्ठभूमि को बदलने योग्य बनाना"

पहचान

दुर्भाग्य से SearchView थीम, शैलियां और विरासत का उपयोग करके SearchView टेक्स्ट फ़ील्ड शैली सेट करने का कोई तरीका नहीं है क्योंकि आप एक्शनबार ड्रॉपडाउन में आइटम की पृष्ठभूमि के साथ कर सकते हैं । इसका कारण यह है कि selectableItemBackground को आर । स्टाइलबल में R.stylable रूप में सूचीबद्ध किया गया है, जबकि searchViewTextField (थीम विशेषता जो हमें रूचि में है) नहीं है। इस प्रकार, हम इसे एक्सएमएल संसाधनों के भीतर आसानी से एक्सेस नहीं कर सकते (आपको No resource found that matches the given name: attr 'android:searchViewTextField' मिलेगा No resource found that matches the given name: attr 'android:searchViewTextField' त्रुटि)

कोड से SearchView पाठ फ़ील्ड पृष्ठभूमि सेट करना

इसलिए, SearchView टेक्स्ट फ़ील्ड की पृष्ठभूमि को ठीक तरह से स्थानांतरित करने का एकमात्र तरीका यह है कि SearchView में शामिल हो, यह देखने के लिए एक्सेस प्राप्त करें कि पृष्ठभूमि में searchViewTextField आधार पर सेट किया searchViewTextField और अपना खुद का सेट करें

नोट: नीचे दिए गए समाधान केवल android:id/search_plate में तत्व के आईडी ( android:id/search_plate ) पर निर्भर करता है, इसलिए यह बच्चों के ट्रवर्सल से अधिक एसडीके-संस्करण है (उदाहरण के लिए searchView.getChildAt(0) का उपयोग कर searchView.getChildAt(0) में सही दृश्य प्राप्त करने के लिए), लेकिन यह बुलेट प्रूफ नहीं है खासकर यदि कुछ निर्माता खोज- SearchView आंतरिक पुनःपूर्ति का निर्णय करता है और उपर्युक्त आईडी के साथ तत्व मौजूद नहीं है – कोड काम नहीं करेगा।

एसडीके में, खोज-फ़ील्ड में टेक्स्ट फ़ील्ड के लिए पृष्ठभूमि को नौ-पैच के माध्यम से घोषित किया जाता है, इसलिए हम इसे उसी तरह करेंगे आप एंड्रॉइड जीआईटी रिपॉजिटरी के ड्रॉएबल-एमडीपीआई डायरेक्टरी में मूल पीजीजी चित्र पा सकते हैं। हमें दो छवि में दिलचस्पी है एक राज्य के लिए जहां पाठ क्षेत्र का चयन किया गया है (नामित textfield_search_selected_holo_light.9.png ) और जहां वह नहीं है (नामित textfield_search_default_holo_light.9.png )।

दुर्भाग्य से, आपको दोनों छवियों की स्थानीय प्रतियां बनाना होगा, भले ही आप केवल केंद्रित स्थिति को कस्टमाइज़ करना चाहते हैं। इसका कारण यह है कि textfield_search_default_holo_light R.drawable में मौजूद नहीं है। इस प्रकार यह @android:drawable/textfield_search_default_holo_light माध्यम से आसानी से सुलभ नहीं हो सकता है @android:drawable/textfield_search_default_holo_light , जो स्थानीय ड्रॉएबल को संदर्भित करने के बजाय नीचे दिखाए गए चयनकर्ता में उपयोग किया जा सकता है।

नोट: मैं Holo Light थीम का आधार के रूप में उपयोग कर रहा था, लेकिन आप होलो डार्क के साथ ऐसा कर सकते हैं। ऐसा लगता है कि लाइट और डार्क थीम के बीच चयनित राज्य 9-पैच में कोई वास्तविक अंतर नहीं है। हालांकि, डिफ़ॉल्ट राज्य के लिए 9-पैच में अंतर है ( प्रकाश बनाम डार्क देखें) इसलिए, शायद अंधेरे और हल्की दोनों विषयों के लिए चयनित राज्य के लिए 9-पैच की स्थानीय प्रतियां बनाने की कोई आवश्यकता नहीं है (यह मानते हुए कि आप दोनों को संभाल करना चाहते हैं, और उन्हें दोनों को होलो थीम के समान ही दिखना चाहिए)। बस एक स्थानीय प्रति बनाएं और चयनकर्ता में दोनों थीम के लिए पेंट करने योग्य उपयोग करें।

अब, आपको डाउनलोड की नौ-पैच को आपकी ज़रूरत (जैसे कि लाल रंग में नीले रंग बदलना) को संपादित करना होगा। आप अपने संपादन के बाद यह सही ढंग से परिभाषित है कि यह जांचने के लिए 9-पैच टूल ड्रॉ करके फ़ाइल पर एक नज़र डाल सकते हैं।

मैंने एक पिक्सेल पेंसिल उपकरण (बहुत आसान) के साथ जीआईएमपी का उपयोग करते हुए फाइलों को संपादित किया है, लेकिन आप शायद अपने खुद के उपकरण का उपयोग करेंगे केंद्रित राज्य के लिए यहां मेरा अनुकूलित 9-पैच है:

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

नोट: सादगी के लिए, मैंने केवल एमडीपीआई घनत्व के लिए छवियों का उपयोग किया है यदि आप किसी भी डिवाइस पर सबसे अच्छा परिणाम चाहते हैं, तो आपको एकाधिक स्क्रीन घनत्व के लिए 9-पैच बनाना होगा। Holo SearchView लिए छवियाँ SearchView और xhdpi SearchView जा सकती हैं।

अब, हमें ड्रॉएबल चयनकर्ता बनाने की आवश्यकता होगी, ताकि उचित स्थिति को दृश्य राज्य के आधार पर प्रदर्शित किया जा सके। निम्नलिखित सामग्री के साथ फ़ाइल 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 का उपयोग करेंगे, जो खोज फ़ील्ड के भीतर टेक्स्ट फ़ील्ड 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 नियंत्रक में कोई एक पंक्ति ढूँढ सकता है जो लेआउट फुलाता है:

 inflater.inflate(R.layout.search_view, this, true); 

अब हम जानते हैं कि SearchView लेआउट फ़ाइल res/layout/search_view.xml । Search_view.xml को देखकर हम एंड्रॉइड के साथ एक आंतरिक search_plate तत्व (आईडी search_plate साथ) पा सकते हैं। search_plate android.widget.SearchView$SearchAutoComplete अंदर 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 विशेषता को कैसे सेट किया गया है यह searchViewTextField , हम res / values ​​/ 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_darkTheme.Light लिए। Theme.Light वैल्यू भी उस फाइल में सेट है ।

अब, यह बहुत अच्छा होगा कि यह विशेषता आर। शैली के माध्यम से पहुंच योग्य है, लेकिन, दुर्भाग्यवश यह नहीं है। तुलना के लिए, अन्य थीम विशेषताओं को देखें जो कि themes.xml और R.attr जैसे टेक्स्ट प्रस्तुतीकरण या selectableBackground दोनों में मौजूद हैं। यदि searchViewTextField R.attr (और R.stylable ) में मौजूद था, तो हम XML में हमारे पूरे एप्लिकेशन के लिए थीम को परिभाषित करते समय बस हमारे 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-पैच हो) हो। आप एंड्रॉइडलाइनों पर एंड्रॉइड के सभी संस्करणों (लगभग) से कुल 9-पैच ड्रॉएबल पा सकते हैं

अनुकूलित

हम 9-पैच में से एक में नीली रेखा को पहचानते हैं , इसलिए हम इसकी स्थानीय प्रतिलिपि बनाते हैं और वांछित रंग बदलते हैं

उपरोक्त समाधान काम नहीं कर सकते हैं यदि आप ऐप्परपाट लाइब्रेरी का उपयोग कर रहे हैं। आपको एपैंपपेट लाइब्रेरी के लिए काम करने के लिए कोड को संशोधित करना पड़ सकता है।

एपक्म्पपेट लाइब्रेरी के लिए यहां कार्य समाधान है।

  @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.main_menu, menu); SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE); MenuItem searchMenuItem = menu.findItem(R.id.action_search); SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem); searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName())); SearchView.SearchAutoComplete searchAutoComplete = (SearchView.SearchAutoComplete)searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text); searchAutoComplete.setHintTextColor(Color.WHITE); searchAutoComplete.setTextColor(Color.WHITE); View searchplate = (View)searchView.findViewById(android.support.v7.appcompat.R.id.search_plate); searchplate.setBackgroundResource(R.drawable.texfield_searchview_holo_light); ImageView searchCloseIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_close_btn); searchCloseIcon.setImageResource(R.drawable.abc_ic_clear_normal); ImageView voiceIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_voice_btn); voiceIcon.setImageResource(R.drawable.abc_ic_voice_search); ImageView searchIcon = (ImageView)searchView.findViewById(android.support.v7.appcompat.R.id.search_mag_icon); searchIcon.setImageResource(R.drawable.abc_ic_search); return super.onCreateOptionsMenu(menu); } 

आपका onCreateOptionsMenu विधि होना चाहिए:

 @Override public boolean onCreateOptionsMenu(Menu menu) { getMenuInflater().inflate(R.menu.option, menu); SearchView searchView = (SearchView) menu.findItem(R.id.menu_search).getActionView(); int linlayId = getResources().getIdentifier("android:id/search_plate", null, null); ViewGroup v = (ViewGroup) searchView.findViewById(linlayId); v.setBackgroundResource(R.drawable.searchviewredversion); return super.onCreateOptionsMenu(menu); } 

जहां आपकी खोज वस्तु menu_search खोज बंद है

और यहां खोज- searchviewredversion (यह एक है xhdpi संस्करण): http://img836.imageshack.us/img836/5964/searchviewredversion.png

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

उपर्युक्त समाधान ActionBarSherlock 4.2 के साथ काम नहीं करता है और इसलिए यह एंड्रॉइड 2.x के लिए पिछड़े संगत नहीं है। यहां कोड काम कर रहा है जो ActionBarSherlock 4.2 पर SearchView पृष्ठभूमि और इशारा पाठ सेटअप करता है:

 public static void styleSearchView(SearchView searchView, Context context) { View searchPlate = searchView.findViewById(R.id.abs__search_plate); searchPlate.setBackgroundResource(R.drawable.your_custom_drawable); AutoCompleteTextView searchText = (AutoCompleteTextView) searchView.findViewById(R.id.abs__search_src_text); searchText.setHintTextColor(context.getResources().getColor(R.color.your_custom_color)); } 

मैं भी ऐसा करने के लिए थक गया हूँ और मैं v7 का उपयोग कर रहा हूं। आवेदन क्रैश हो गया जब मैंने getIdentifier() माध्यम से getIdentifier() को पकड़ने की कोशिश की तो मैंने इसे इस तरह किया:

 View searchPlate = searchView.findViewById(android.support.v7.appcompat.R.id.search_plate); 

सबसे पहले, आइए हम एक searchable_widget_background.xml नामक एक एक्सएमएल फाइल बनाते हैं, जिसका उपयोग ड्रॉएबल के रूप में किया जा सकता है, अर्थात ड्रॉएबल डायरेक्टरी के अंतर्गत।

 <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@color/red" /> </shape> 

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

अगला कदम इस खोज के लिए हमारे खोज विजेट की पृष्ठभूमि को सेट करना है। यह निम्नलिखित द्वारा पूरा किया जा सकता है:

  public boolean onCreateOptionsMenu(Menu menu) { SearchView searchView = (SearchView)menu.findItem(R.id.my_search_view).getActionView(); Drawable d = getResources().getDrawable(R.drawable.search_widget_background); searchView.setBackground(d); ... } 

मुझे भी इसी समस्या का सामना करना पड़ा। मैंने इसके लिए ऐपैंपपेट v7 लाइब्रेरी और परिभाषित कस्टम स्टाइल का इस्तेमाल किया। ड्रॉएबल फ़ोल्डर में bottom_border.xml फ़ाइल है जो इस तरह दिखती है:

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape > <solid android:color="@color/blue_color" /> </shape> </item> <item android:bottom="0.8dp" android:left="0.8dp" android:right="0.8dp"> <shape > <solid android:color="@color/background_color" /> </shape> </item> <!-- draw another block to cut-off the left and right bars --> <item android:bottom="2.0dp"> <shape > <solid android:color="@color/main_accent" /> </shape> </item> </layer-list> 

मान फ़ोल्डर में styles_myactionbartheme.xml:

 <?xml version="1.0" encoding="utf-8"?> <resources> <style name="AppnewTheme" parent="Theme.AppCompat.Light"> <item name="android:windowBackground">@color/background</item> <item name="android:actionBarStyle">@style/ActionBar</item> <item name="android:actionBarWidgetTheme">@style/ActionBarWidget</item> </style> <!-- Actionbar Theme --> <style name="ActionBar" parent="Widget.AppCompat.Light.ActionBar.Solid.Inverse"> <item name="android:background">@color/main_accent</item> <!-- <item name="android:icon">@drawable/abc_ic_ab_back_holo_light</item> --> </style> <style name="ActionBarWidget" parent="Theme.AppCompat.Light"> <!-- SearchView customization--> <!-- Changing the small search icon when the view is expanded --> <!-- <item name="searchViewSearchIcon">@drawable/ic_action_search</item> --> <!-- Changing the cross icon to erase typed text --> <!-- <item name="searchViewCloseIcon">@drawable/ic_action_remove</item> --> <!-- Styling the background of the text field, ie blue bracket --> <item name="searchViewTextField">@drawable/bottom_border</item> <!-- Styling the text view that displays the typed text query --> <item name="searchViewAutoCompleteTextView">@style/AutoCompleteTextView</item> </style> <style name="AutoCompleteTextView" parent="Widget.AppCompat.Light.AutoCompleteTextView"> <item name="android:textColor">@color/text_color</item> <!-- <item name="android:textCursorDrawable">@null</item> --> <!-- <item name="android:textColorHighlight">@color/search_view_selected_text</item> --> </style> </resources> 

मैं मेनू प्रदर्शित करने के लिए custommenu.xml फ़ाइल को परिभाषित किया है:

 <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:com.example.actionbartheme="http://schemas.android.com/apk/res-auto" > <item android:id="@+id/search" android:title="@string/search_title" android:icon="@drawable/search_buttonn" com.example.actionbartheme:showAsAction="ifRoom|collapseActionView" com.example.actionbartheme:actionViewClass="android.support.v7.widget.SearchView"/> 

आपकी गतिविधि गतिविधि के बजाय ActionBarActivity का विस्तार करना चाहिए

 @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.custommenu, menu); } 

मैनिफेस्ट फ़ाइल में:

 <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppnewTheme" > 

अधिक जानकारी के लिए यहां देखें:
यहां http://www.jayway.com/2014/06/02/android-theming-the-actionbar/

 public boolean onCreateOptionsMenu(Menu menu) { ........ // Set the search plate color int linlayId = getResources().getIdentifier("android:id/search_plate", null, null); View view = searchView.findViewById(linlayId); Drawable drawColor = getResources().getDrawable(R.drawable.searchcolor); view.setBackground( drawColor ); ........ } 

और यह searchablecolor.xml फ़ाइल है

 <?xml version="1.0" encoding="utf-8"?> <layer-list xmlns:android="http://schemas.android.com/apk/res/android" > <item> <shape > <solid android:color="#ffffff" /> </shape> </item> <!-- main color --> <item android:bottom="1.5dp" android:left="1.5dp" android:right="1.5dp"> <shape > <solid android:color="#2c4d8e" /> </shape> </item> <!-- draw another block to cut-off the left and right bars --> <item android:bottom="18.0dp"> <shape > <solid android:color="#2c4d8e" /> </shape> </item> </layer-list>