10

我在嘗試將搜索建議更改爲「輕量主題」。 我正在使用appcompat-v7:22.2.0庫,並閱讀了關於new feature的定製搜索視圖窗口小部件(android.support.v7.widget.SearchView)。工具欄搜索建議主題

先試試第

工具欄

<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:background="?attr/colorPrimary" 
    android:minHeight="?attr/actionBarSize" 
    app:popupTheme="@style/ThemeOverlay.AppCompat.Light" 
    app:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar" /> 

主旋律

<style name="Main.Theme" parent="Theme.AppCompat.Light.NoActionBar"> 
    <item name="colorPrimary">@color/red</item> 
    <item name="colorPrimaryDark">@color/red_dark</item> 
    <item name="searchViewStyle">@style/Main.Theme.SearchView</item> 
</style> 

搜索查看主題

<style name="Main.Theme.SearchView" parent="Widget.AppCompat.Light.SearchView"> 
    <item name="voiceIcon">@mipmap/test_icon</item> 
</style> 

這樣,我不能夠影響搜索視圖。爲了測試它,我正在更改搜索視圖中的語音圖標,並且它不會從默認更改。

第二次嘗試部分

第二次嘗試是覆蓋在工具欄上覆蓋主題:

疊加主題

<style name="Main.Theme.Overlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar"> 
    <item name="searchViewStyle">@style/Main.Theme.SearchView</item> 
</style> 

這樣,我有一些反饋,但我失去了「材料設計」,尤其是我有「舊」提示圖標,並加下劃線。 我的最終目的是要改變搜索建議行背景:

建議行佈局

<item name="suggestionRowLayout">@layout/my_custom_layout</item> 

我認爲我遠來完成這個......你能幫助我嗎?

+0

您是否找到了解決方案?我也面臨同樣的問題。爲工具欄設置app:theme =「@ style/ThemeOverlay.AppCompat.ActionBar」,使建議彈出淺色背景。但沒有達到目的。 – Sreekanth

+0

@Sreekanth:在工具欄中,您應該使用'app:theme =「@ style/Main.the.Overlay」'而不是'app:theme =「@ style/ThemeOverlay.AppCompat.Dark.ActionBar」' –

+1

是「Main.Theme.Overlay」? – Sreekanth

回答

3

這是我如何用我自己的搜索建議...

這是我CountriesFragment文件只是顯示在建議所有國家名稱。

這裏的訣竅是我提供了自定義的View to Suggestion列表來顯示。

public class CountriesFragment extends Fragment { 

    private boolean mSearchCheck; 
    private SimpleCursorAdapter mAdapter; 
    public static final String TEXT_FRAGMENT = "TEXT_FRAGMENT"; 
    public static final String CITY_NAME = "cityName"; 
    private LayoutInflater mInflater; 
    private ViewGroup mainContainer; 

    private static final String[] COUNTRIES = { 
      "Afghanistan", "Albania", "Algeria", "American Samoa", "Andorra", "Angola", "Anguilla", "Antarctica", 
      "Antigua and Barbuda", "Argentina", "Armenia", "Aruba", "Australia", "Austria", "Azerbaijan", "Bahamas", "Bahrain", "Bangladesh", "Barbados", 
      "Belarus", "Belgium", "Belize", "Benin", "Bermuda", "Bhutan", "Bolivia", "Bosnia and Herzegowina", "Botswana", "Bouvet Island", "Brazil", 
      "British Indian Ocean Territory", "Brunei Darussalam", "Bulgaria", "Burkina Faso", "Burundi", "Cambodia", "Cameroon", "Canada", "Cape Verde", 
      "Cayman Islands", "Central African Republic", "Chad", "Chile", "China", "Christmas Island", "Cocos (Keeling) Islands", "Colombia", "Comoros", 
      "Congo", "Congo, the Democratic Republic of the", "Cook Islands", "Costa Rica", "Cote d'Ivoire", "Croatia (Hrvatska)", "Cuba", "Cyprus", 
      "Czech Republic", "Denmark", "Djibouti", "Dominica", "Dominican Republic", "East Timor", "Ecuador", "Egypt", "El Salvador", "Equatorial Guinea", 
      "Eritrea", "Estonia", "Ethiopia", "Falkland Islands (Malvinas)", "Faroe Islands", "Fiji", "Finland", "France", "France Metropolitan", "French Guiana", 
      "French Polynesia", "French Southern Territories", "Gabon", "Gambia", "Georgia", "Germany", "Ghana", "Gibraltar", "Greece", "Greenland", "Grenada", 
      "Guadeloupe", "Guam", "Guatemala", "Guinea", "Guinea-Bissau", "Guyana", "Haiti", "Heard and Mc Donald Islands", "Holy See (Vatican City State)", 
      "Honduras", "Hong Kong", "Hungary", "Iceland", "India", "Indonesia", "Iran (Islamic Republic of)", "Iraq", "Ireland", "Israel", "Italy", "Jamaica", 
      "Japan", "Jordan", "Kazakhstan", "Kenya", "Kiribati", "Korea, Democratic People's Republic of", "Korea, Republic of", "Kuwait", "Kyrgyzstan", 
      "Lao, People's Democratic Republic", "Latvia", "Lebanon", "Lesotho", "Liberia", "Libyan Arab Jamahiriya", "Liechtenstein", "Lithuania", "Luxembourg", 
      "Macau", "Macedonia, The Former Yugoslav Republic of", "Madagascar", "Malawi", "Malaysia", "Maldives", "Mali", "Malta", "Marshall Islands", "Martinique", 
      "Mauritania", "Mauritius", "Mayotte", "Mexico", "Micronesia, Federated States of", "Moldova, Republic of", "Monaco", "Mongolia", "Montserrat", "Morocco", 
      "Mozambique", "Myanmar", "Namibia", "Nauru", "Nepal", "Netherlands", "Netherlands Antilles", "New Caledonia", "New Zealand", "Nicaragua", "Niger", "Nigeria", 
      "Niue", "Norfolk Island", "Northern Mariana Islands", "Norway", "Oman", "Pakistan", "Palau", "Panama", "Papua New Guinea", "Paraguay", "Peru", "Philippines", 
      "Pitcairn", "Poland", "Portugal", "Puerto Rico", "Qatar", "Reunion", "Romania", "Russian Federation", "Rwanda", "Saint Kitts and Nevis", "Saint Lucia", 
      "Saint Vincent and the Grenadines", "Samoa", "San Marino", "Sao Tome and Principe", "Saudi Arabia", "Senegal", "Seychelles", "Sierra Leone", "Singapore", 
      "Slovakia (Slovak Republic)", "Slovenia", "Solomon Islands", "Somalia", "South Africa", "South Georgia and the South Sandwich Islands", "Spain", "Sri Lanka", 
      "St. Helena", "St. Pierre and Miquelon", "Sudan", "Suriname", "Svalbard and Jan Mayen Islands", "Swaziland", "Sweden", "Switzerland", "Syrian Arab Republic", 
      "Taiwan, Province of China", "Tajikistan", "Tanzania, United Republic of", "Thailand", "Togo", "Tokelau", "Tonga", "Trinidad and Tobago", "Tunisia", 
      "Turkey", "Turkmenistan", "Turks and Caicos Islands", "Tuvalu", "Uganda", "Ukraine", "United Arab Emirates", "United Kingdom", "United States", 
      "United States Minor Outlying Islands", "Uruguay", "Uzbekistan", "Vanuatu", "Venezuela", "Vietnam", "Virgin Islands (British)", "Virgin Islands (U.S.)", 
      "Wallis and Futuna Islands", "Western Sahara", "Yemen", "Yugoslavia", "Zambia", "Zimbabwe" 
    }; 

    public static CountriesFragment newInstance(String text) { 
     CountriesFragment mFragment = new CountriesFragment(); 
     Bundle mBundle = new Bundle(); 
     mBundle.putString(TEXT_FRAGMENT, text); 
     mFragment.setArguments(mBundle); 
     return mFragment; 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     loadHints(); 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_countries, container, false); 
     mInflater = inflater; 
     mainContainer = (ViewGroup) rootView.findViewById(R.id.container); 
     //rootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT)); 
     return rootView; 
    } 

    @Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 
     setHasOptionsMenu(true); 
    } 

    @Override 
    public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { 
     super.onCreateOptionsMenu(menu, inflater); 
     inflater.inflate(R.menu.menu, menu); 

     SearchView searchView = (SearchView) MenuItemCompat.getActionView(menu.findItem(R.id.menu_search)); 
     searchView.setQueryHint(this.getString(R.string.search)); 

     ((EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text)) 
       .setHintTextColor(getResources().getColor(R.color.nliveo_white)); 


     searchView.setSuggestionsAdapter(mAdapter); 
     searchView.setOnQueryTextListener(onQuerySearchView); 
     searchView.setOnSuggestionListener(onQuerySuggestion); 

     menu.findItem(R.id.menu_add).setVisible(true); 
     menu.findItem(R.id.menu_search).setVisible(true); 

     mSearchCheck = false; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 

     switch (item.getItemId()) { 

      case R.id.menu_add: 
       addCountry(); 
       break; 

      case R.id.menu_search: 
       mSearchCheck = true; 
       break; 
     } 
     return true; 
    } 

    private void addCountry() { 
     final ViewGroup newView = (ViewGroup) mInflater.inflate(R.layout.country_row, mainContainer, false); 
     final TextView countryName = (TextView) newView.findViewById(android.R.id.text1); 
     countryName.setText(COUNTRIES[(int) (Math.random() * COUNTRIES.length)]); 


     final Animation fadeIn = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_in); 
     final Animation fadeOut = AnimationUtils.loadAnimation(getActivity(), R.anim.fade_out); 
     fadeIn.setFillAfter(false); 
     fadeOut.setFillAfter(false); 

     final ImageButton closeButton = (ImageButton) newView.findViewById(R.id.delete_button); 
     closeButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       newView.startAnimation(fadeOut); 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 
         mainContainer.removeView(newView); 
        } 
       }, fadeOut.getDuration()); 
      } 
     }); 

     mainContainer.addView(newView, 0); 
     newView.startAnimation(fadeIn); 
    } 

    private SearchView.OnQueryTextListener onQuerySearchView = new SearchView.OnQueryTextListener() { 
     @Override 
     public boolean onQueryTextSubmit(String query) { 
      mSearchCheck = false; 
      return false; 
     } 

     @Override 
     public boolean onQueryTextChange(String query) { 
      if (mSearchCheck) { 
       // implement your search here 
       giveSuggestions(query); 
      } 
      return false; 
     } 
    }; 

    private void giveSuggestions(String query) { 
     final MatrixCursor cursor = new MatrixCursor(new String[]{BaseColumns._ID, CITY_NAME}); 
     for (int i = 0; i < COUNTRIES.length; i++) { 
      if (COUNTRIES[i].toLowerCase().contains(query.toLowerCase())) 
       cursor.addRow(new Object[]{i, COUNTRIES[i]}); 
     } 
     mAdapter.changeCursor(cursor); 
    } 

    private SearchView.OnSuggestionListener onQuerySuggestion = new SearchView.OnSuggestionListener() { 
     @Override 
     public boolean onSuggestionSelect(int position) { 
      return false; 
     } 

     @Override 
     public boolean onSuggestionClick(int position) { 
      return false; 
     } 
    }; 

    private void loadHints() { 
     final String[] from = new String[]{CITY_NAME}; 
     final int[] to = new int[]{android.R.id.text1}; 
     mAdapter = new SimpleCursorAdapter(getActivity(), 
       R.layout.hint_row, 
       null, 
       from, 
       to, 
       CursorAdapter.FLAG_REGISTER_CONTENT_OBSERVER); 
    } 
} 

這裏是具有搜索查看的hint_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:textAppearance="?android:attr/textAppearanceListItemSmall" 
    android:gravity="center_vertical" 
    android:background="@color/nliveo_green_colorPrimaryDark" 
    android:textColor="@color/nliveo_white" 
    android:paddingLeft="15dp" 
    android:paddingRight="15dp" 
    android:minHeight="?android:attr/listPreferredItemHeightSmall" 
    android:elevation="3dp" 
    android:alpha="0.7" /> 

簡單的菜單文件。 menu.xml

<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto"> 

    <item 
     android:id="@+id/menu_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     android:icon="@mipmap/ic_search_white_24dp" 
     app:showAsAction="ifRoom|collapseActionView" 
     android:title="@string/search"/> 
    <item 
     android:id="@+id/menu_add" 
     android:icon="@mipmap/ic_add_white_24dp" 
     app:showAsAction="ifRoom" 
     android:title="@string/add"/> 

</menu> 

我得到這個美麗的建議...

Custom Hints

+1

*請建議我們如何才能得到一個輕的主題建議彈出,而工具欄有黑暗的主題。* – Machado

3

建議是系統創建一個動態列表,而不是一項活動。所以你不能使用輕量級的主題。

相反,您可以通過使用樣式自定義建議,讓它感覺像一個輕的主題。

使用本hint_row.xml

<?xml version="1.0" encoding="utf-8"?> 
<TextView xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@android:id/text1" 
    style="@style/suggestionsTheme" 
    android:layout_width="match_parent" 
    android:layout_height="48dp" 
    android:gravity="center_vertical" 
    android:text="demo" 
    android:paddingLeft="15dp" 
    android:paddingRight="15dp" /> 

而且應用這種風格

<style name="suggestionsTheme" parent="TextAppearance.AppCompat.Light.SearchResult.Subtitle" > 
     <item name="android:background">@android:color/white</item> 
     <item name="android:textColor">@android:color/black</item> 

現在我得到這個

Light suggestions

您可以根據您的需要

給予更多風格
+0

如何告訴應用程序使用「hint_row.xml」作爲消化文本視圖? – Sreekanth

+0

看到我以前的答案。使用上面的文件'CountriesFragment.java' –

+0

我發佈了不同的答案,因爲兩個答案都不同。首先是關於自定義建議,其次是關於應用light appcompat searchview主題的建議。兩者都是相互獨立的。一個人可以使用一個人想要的應用程序... –