2012-03-19 18 views
5

क्या एंड्रॉइड.विड्ज के लेआउट को अनुकूलित करना संभव है। खोज दृश्य (मैं इसे क्रियाबार में उपयोग कर रहा हूं)?अनुकूलित करना android.widget.SearchView

मैं आइकन और टेक्स्टफ़ील्ड पृष्ठभूमि बदलना चाहता हूं।

उत्तर

17

मुझे प्रतिबिंब का उपयोग करने के लिए ऐसा करने का एकमात्र तरीका मिला है।

SearchView mSearchView = (SearchView)menu.findItem(R.id.search).getActionView(); 
    try 
    { 
     Field searchField = SearchView.class.getDeclaredField("mSearchButton"); 
     searchField.setAccessible(true); 
     ImageView searchBtn = (ImageView)searchField.get(mSearchView); 
     searchBtn.setImageResource(R.drawable.search_img); 
     searchField = SearchView.class.getDeclaredField("mSearchPlate"); 
     searchField.setAccessible(true); 
     LinearLayout searchPlate = (LinearLayout)searchField.get(mSearchView); 
     ((ImageView)searchPlate.getChildAt(0)).setImageResource(R.drawable.search_img); 
     searchPlate.setBackgroundResource(R.drawable.edit_text_bkg); 
    } 
    catch (NoSuchFieldException e) 
    { 
     Log.e(TAG,e.getMessage(),e); 
    } 
    catch (IllegalAccessException e) 
    { 
     Log.e(TAG,e.getMessage(),e); 
    } 
+0

बहुत खूब! मुझे यह भी पता नहीं था कि जावा में ऐसी चीजें संभव हैं :) धन्यवाद हिस्टलर – pjanecze

+0

उन लोगों के लिए जो ImageView उत्सुक हैं, जब खोज दृश्य को ध्वस्त कर दिया गया है तो "एशर्चबटन" ... –

+0

SearchView.class.getDeclaredField ("mSearchButton") सब कुछ शून्य देता है ... कोई विचार? – Anthea

-1

ActionBarSherlock में:

<style name="Your_Theme" parent="@style/Theme.Sherlock"> 
    <item name="searchViewSearchIcon"> @drawable/ic_menu_search </item> 
</style> 

Holo में:

<style name="Your_Theme" parent="@style/Theme.Light"> 
    <item name="android:searchViewSearchIcon"> @drawable/ic_search </item> 
</style> 
+1

यह होलो में काम नहीं करता है। 'android: searchViewSearchIcon' सार्वजनिक रूप से सुलभ नहीं है –

1

आप एंड्रॉयड देशी SearchView उपयोग कर रहे हैं और आप जो जब SearchView का विस्तार होता है प्रतीत होता है छोटा सा खोज आइकन, बदलना चाहते हैं, तो आप परेशानी में हैं। चूंकि विशेषता खोज ViewSearchIcon आंतरिक है, और शैलियों का उपयोग करके संशोधित नहीं किया जा सकता है। SearchView वर्ग से

कोड स्निपेट:

निम्नलिखित शैली ऐलान करते हैं और अनुकूलित केवल उन गुणों की जरूरत:

private int getSearchIconId() { 
    TypedValue outValue = new TypedValue(); 
    getContext().getTheme().resolveAttribute(com.android.internal.R.attr.searchViewSearchIcon, 
      outValue, true); 
    return outValue.resourceId; 
} 
3

आप Appcompat v7 का उपयोग करते हैं, वहाँ प्रतिबिंब का उपयोग किए बिना यह करने के लिए एक रास्ता है अनुकूलित करने के लिए, बाकी को दूर (ताकि वे माता-पिता शैली से inerhited हैं):

<style name="Widget.AppCompat.SearchView.CustomSearchView" parent="@style/Widget.AppCompat.SearchView"> 
    <item name="layout">@layout/abc_search_view</item> 
    <item name="queryBackground">@drawable/abc_textfield_search_material</item> 
    <item name="submitBackground">@drawable/abc_textfield_search_material</item> 
    <item name="closeIcon">@drawable/abc_ic_clear_mtrl_alpha</item> 
    <item name="goIcon">@drawable/abc_ic_go_search_api_mtrl_alpha</item> 
    <item name="voiceIcon">@drawable/abc_ic_voice_search_api_mtrl_alpha</item> 
    <item name="commitIcon">@drawable/abc_ic_commit_search_api_mtrl_alpha</item> 
    <item name="suggestionRowLayout">@layout/abc_search_dropdown_item_icons_2line</item> 
    <item name="searchIcon">@drawable/ic_action_search</item> 
</style> 

अब, अपने विषय में, एक ही संपत्ति का उपयोग करें:

<item name="searchViewStyle">@style/Widget.AppCompat.SearchView.Bonial</item> 
बेशक

, अपने विषय AppCompat विषयों में से एक से विरासत चाहिए, मेरे मामले में, यह कुछ इस तरह था:

<style name="Theme.MyActionBarActivity" parent="@style/Theme.AppCompat.Light"> 

इसके अलावा अपने गतिविधियों ActionBarActivity का विस्तार करने और "समर्थन" का उपयोग करना चाहिए एक्शन बार विधियों का संस्करण। More info here

मैं भी है कि किसी अन्य तरीके से शैलियों घोषित एक पुरुष के एक लेख पढ़ा, लेकिन यह भी AppCompat v7 का उपयोग कर: http://www.jayway.com/2014/06/02/android-theming-the-actionbar/

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