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


122

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

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

लेकिन मुझे नीले रंग की पृष्ठभूमि को एक लाल रंग में बदलने की आवश्यकता है।

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

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


1
मेरा मानना ​​है कि यह एसओ पद आपकी सहायता कर सकता है जिसे आप पूरा करना चाहते हैं, अगर आपने इसे पहले से चेक नहीं किया है।
एंजेलो

@Angelo दुर्भाग्य से, यह SearchViewपृष्ठभूमि के साथ संभव नहीं है क्योंकि यह अंदर से उपलब्ध नहीं है R.styleable। नीचे मेरा जवाब बताता है कि इसे कोड में कैसे करना है।
vArDo

आपको "फिल्म का नाम दर्ज करें" पाठ कैसे मिला?
ज़ेन

आप खोज दृश्य में संकेत पाठ को इस तरह सेट कर सकते हैं: SearchView.SearchAutoComplete खोजऑटोकॉम = (SearchView.SearchAutoComplete) searchView.findViewById (android.support.v7.appspat.R.id.search_src_text); searchAutoComplete.setHint ("संकेत पाठ");
डोमिनिक

मैंने इस पोस्ट के अंत में बताया। छवियों के साथ /programming/47426541/how-to-change-searchbar-cancel-button-image-in-xamarin-forms/51297028#51297028
vu ledang

जवाबों:


253

पहचान

दुर्भाग्य से सेट करने का कोई तरीका नहीं है 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.xmlSearch_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.attrR.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-पैच में से एक में नीली रेखा को पहचानते हैं , इसलिए हम इसकी स्थानीय प्रति बनाते हैं और इच्छानुसार रंग बदलते हैं।


आपका java code काम नहीं करेगा, उसका SearchView ActionBar में है और findViewById विधि से नहीं पाया जा सकता है। लेकिन बाकी सब सही है!
विंसफ्रैग जूल

@VinceFR कि बाहर इशारा करने के लिए धन्यवाद। इस पर ध्यान नहीं दिया (मैंने SearchViewखुद पर ध्यान केंद्रित किया है)। क्या यह ठीक है अगर मैं आपके उत्तर (onCreateOptionsMenu को ओवरराइडिंग) में मिला दूं?
vrro

@VinceFR मैंने आपके कोड को onCreate()विधि से विधि में स्थानांतरित onCreateOptionsMenu()कर दिया है जैसा आपने सुझाया है। अपना उत्तर दिया।
vrro

बहुत बहुत धन्यवाद: D कोई ऐसा तरीका है जिससे मैं Mag आइकॉन और क्लोज़ आइकॉन को समान तरीके से बदल सकता हूँ?
हर्षा एमवी

हम एक आवर्धक आइकन कैसे बदल सकते हैं? मैं सब कुछ करने की कोशिश करता हूं, लेकिन मैं इसे बदल नहीं सकता ... धन्यवाद ... और शर्लक एक्शन बार में यह कैसे करें?
जोवन

31

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

यहाँ appcompat पुस्तकालय के लिए काम कर समाधान है।

  @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);
}

1
यह search_mag_icon के लिए काम नहीं करता है। : यह देता है "0x01010479 शैली बुरा प्रवेश के साथ कुंजी है"
लावण्या

1
खोज प्लेट मेरे लिए काम नहीं करती है (यह कुछ करता है लेकिन मैं नीचे की रेखा में कोई बदलाव नहीं देख सकता), लेकिन
AppCompat के

14

आपकी 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 की अपनी थीम है और अपने खुद के SearchView को परिभाषित करता है। इसका मतलब है कि आप बस अपने विषय में एक आइटम जोड़ सकते हैं, जिसका नाम searchViewTextField है और ऊपर दी गई परिभाषा और 9 पैच का उपयोग कर रहा है।
Nijijak

1
मत भूलना के रूप में 9-पैच निर्यात संपत्ति को इंगित करने के लिए searchviewredversion.9.png लिए फ़ाइल का नाम बदलने के लिए
1owk3y

13

उपरोक्त समाधान 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));
}

मुझे यह कोड कहां रखना चाहिए? मैं एक्शन बार के 4.2 संस्करण में ऐसा करने की कोशिश कर रहा हूं। मेरा प्रश्न stackoverflow.com/questions/13992424/…
हर्षा एमवी

नमस्ते, इसे onCreateOptionsMenu विधि से कॉल करें। खोज दृश्य ढूंढें और इसे इस विधि को पास करें।
डेविड वावरा

धन्यवाद। किसी भी विचार के रूप में दिखाया गया है कि इनलाइन पत्रिका प्रतीक को हटाने के लिए कैसे यहाँ दिखाया गया है i.imgur.com/YvBz2.png
हर्ष एमवी

3
एबीएस के साथ आप Theme.Sherlock या Theme.Sherlock.Light का विस्तार किया जाएगा नहीं एंड्रॉयड विषयों। इसका मतलब यह है कि आपको बस इतना करना है कि अपने ऐप्लिकेशन थीम की परिभाषा में searchViewTextField नामक आइटम जोड़ें। सभी XML में किए गए कोड की आवश्यकता नहीं है।
Nijijak

5

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

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

3

मुझे भी इसी समस्या का सामना करना पड़ा। मैंने appcompat v7 पुस्तकालय का इस्तेमाल किया और इसके लिए कस्टम शैली को परिभाषित किया। ड्रॉबल फोल्डर में नीचे की तरफ_बॉर्डर .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>

मानों में फ़ोल्डर style_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, i.e. 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/


बाहर की जाँच करें: stackoverflow.com/questions/8211929/… एक और लेयरलिस्ट उदाहरण के लिए।
जेरेड बर्ट्स

3

अपडेट करें

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

    View searchPlate = svSearch. findViewById(androidx.appcompat.R.id.search_plate);
    if (searchPlate != null) {
        AutoCompleteTextView searchText = searchPlate.findViewById(androidx.appcompat.R.id.search_src_text);
        if (searchText != null){
            searchText.setTextSize(TypedValue.COMPLEX_UNIT_PX, getResources().getDimension(R.dimen.edittext_text_size));
            searchText.setMaxLines(1);
            searchText.setSingleLine(true);
            searchText.setTextColor(getResources().getColor(R.color.etTextColor));
            searchText.setHintTextColor(getResources().getColor(R.color.etHintColor));
            searchText.setBackground(null);
        }
    }

2

सबसे पहले, आइए एक XML फ़ाइल बनाते हैं, जिसे search_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>

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

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

    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);
...
    }

@shkschneider IMHO यह काम नहीं करेगा, क्योंकि बैकग्राउंड को अपने SearchViewनाम search_plateपर नहीं ( अंदर ) एक तत्व पर सेट करना SearchViewहोता है। अधिक जानकारी के लिए मेरा जवाब देखें। हालांकि, मुझे स्वीकार करना होगा, मैंने @ (बाबा टेनर) के उत्तर का उपयोग करने की कोशिश नहीं की है।
vArDo

ध्यान नहीं दिया गया कि SearchView ActionBar में था। अब यह काम करना चाहिए।
एरोल

@babatenor यह काम नहीं करेगा क्योंकि पृष्ठभूमि SearchViewखुद के लिए पृष्ठभूमि हमेशा उन तत्वों के लिए पृष्ठभूमि से नीचे होगी जो अंदर हैं SearchViewLinearLayoutअंदर एक दृश्य SearchViewहै जिसमें आईडी है search_plate, उस सेट में पृष्ठभूमि के रूप में यह नीला रेखांकन तत्व है। विवरण के लिए मेरा उत्तर देखें। तो आपके समाधान के साथ परिणाम पूरे विजेट के लिए नीले रंग की पृष्ठभूमि के साथ नीले रंग की रेखांकन अभी भी दिखाई देता है। मैंने जेली बीन पर परीक्षण किया है , लेकिन मुझे नहीं लगता कि एसडीके लक्ष्य संस्करण यहां मायने रखता है।
vArDo

साभार vArDo मैं SearchView की स्तरित संरचना को जानता था, लेकिन मुझे लगा कि यह काम करेगा (यह मुझे कम से कम तार्किक लगता है)।
एलोल

1
@ बबटनर काम करेगा तो बहुत अच्छा होगा, ताकि यह सब
हैकरी के लिए

1
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>

0

मैंने इस पोस्ट के अंत में छवियों के साथ समझाया जो कि xamarin रूपों के लिए लागू है। लेकिन मुझे लगता है कि आप इसे समझ सकते हैं, क्योंकि यह एंड्रॉइड के खोज के स्रोत कोड पर आधारित है

कैसे xamarin रूपों में खोज पट्टी रद्द बटन छवि को बदलने के लिए


0

यदि आप इस तरह Searchview को फुला रहे हैं तो "getMenuInflater ()। Inflate (R.menu.search_menu, menu);"। फिर आप नीचे की तरह style.xml के माध्यम से इस खोज को अनुकूलित कर सकते हैं।

<style name="AppTheme" parent="Theme.AppCompat.DayNight.NoActionBar">
      <item name="searchViewStyle">@style/SearchView.ActionBar</item>
</style>

<style name="SearchView.ActionBar" parent="Widget.AppCompat.SearchView.ActionBar">
      <item name="queryBackground">@drawable/drw_search_view_bg</item>
      <item name="searchHintIcon">@null</item>
      <item name="submitBackground">@null</item>
      <item name="closeIcon">@drawable/vd_cancel</item>
      <item name="searchIcon">@drawable/vd_search</item>
</style>

0

मैं उस बारे में खुदाई कर रहा था और आखिरकार मुझे यह समाधान मिल गया और यह मेरे लिए काम करता है!
आप इसका उपयोग कर सकते हैं

यदि आप appcompat का उपयोग करते हैं तो यह कोशिश करें:

ImageView searchIconView = (ImageView) searchView.findViewById(android.support.v7.appcompat.R.id.search_button);
searchIconView.setImageResource(R.drawable.yourIcon);

यदि आप androidx का उपयोग करते हैं तो यह कोशिश करें:

ImageView searchIconView = (ImageView) searchView.findViewById(androidx.appcompat.R.id.search_button);
    searchIconView.setImageResource(R.drawable.yourIcon);

यह डिफ़ॉल्ट serchview आइकन को बदल देगा।

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.