【问题标题】:Android SearchView in Toolbar工具栏中的 Android SearchView
【发布时间】:2015-10-07 23:01:04
【问题描述】:

我的活动中有工具栏,我曾尝试从菜单添加搜索视图,但无法在工具栏中添加搜索视图,如何在我的活动工具栏中添加搜索视图。?

【问题讨论】:

    标签: android android-fragments searchview


    【解决方案1】:

    menu_main.xml:

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

    \res\xml\searchable.xml:

    <searchable xmlns:android="http://schemas.android.com/apk/res/android"
    android:label="@string/app_name"
    android:hint="@string/search_hint" />
    

    AndroidManifest.xml:

    <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
    
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
            <meta-data android:name="android.app.searchable"
                android:resource="@xml/searchable" />
        </activity>
    

    styles.xml:

    <resources>
    
    <!-- Base application theme. -->
    <style name="AppTheme" parent="android:Theme.Holo.Light">
        <!-- Customize your theme here. -->
    </style>
    

    MainActivity.java:

    package com.example.searchview;
    
    import android.app.Activity;
    import android.app.SearchManager;
    import android.content.Context;
    import android.os.Bundle;
    import android.view.Menu;
    import android.view.MenuItem;
    import android.widget.SearchView;
    
    public class MainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
    
        // Associate searchable configuration with the SearchView
        SearchManager searchManager =
                (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView =
                (SearchView) menu.findItem(R.id.search).getActionView();
        searchView.setSearchableInfo(
                searchManager.getSearchableInfo(getComponentName()));
    
    
        return true;
    }
    
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
    
        return super.onOptionsItemSelected(item);
    }
    }
    

    【讨论】:

      【解决方案2】:

      我已经通过这种方式完成了Fragment

      我使用 search viewonTextChangeListener,只需检查您的 Logcat

      截图参考:

      menu.xml - (res -> menu)

      <menu xmlns:android="http://schemas.android.com/apk/res/android"
          xmlns:app="http://schemas.android.com/apk/res-auto"
          xmlns:tools="http://schemas.android.com/tools"
          tools:context=".HomeActivity">
      
          <item
              android:id="@+id/action_search"
              android:icon="@android:drawable/ic_menu_search"
              android:title="Search"
              app:actionViewClass="android.support.v7.widget.SearchView"
              app:showAsAction="always" />
      
      </menu>
      

      MainFragment.java

      public class MainFragment extends Fragment {
      
          private SearchView searchView = null;
          private SearchView.OnQueryTextListener queryTextListener;
      
          @Nullable
          @Override
          public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
              return inflater.inflate(R.layout.fragment_main, container, false);
          }
      
          @Override
          public void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setHasOptionsMenu(true);
          }
      
          @Override
          public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
              inflater.inflate(R.menu.menu, menu);
              MenuItem searchItem = menu.findItem(R.id.action_search);
              SearchManager searchManager = (SearchManager) getActivity().getSystemService(Context.SEARCH_SERVICE);
      
              if (searchItem != null) {
                  searchView = (SearchView) searchItem.getActionView();
              }
              if (searchView != null) {
                  searchView.setSearchableInfo(searchManager.getSearchableInfo(getActivity().getComponentName()));
      
                  queryTextListener = new SearchView.OnQueryTextListener() {
                      @Override
                      public boolean onQueryTextChange(String newText) {
                          Log.i("onQueryTextChange", newText);
      
                          return true;
                      }
                      @Override
                      public boolean onQueryTextSubmit(String query) {
                          Log.i("onQueryTextSubmit", query);
      
                          return true;
                      }
                  };
                  searchView.setOnQueryTextListener(queryTextListener);
              }
              super.onCreateOptionsMenu(menu, inflater);
          }
      
          @Override
          public boolean onOptionsItemSelected(MenuItem item) {
              switch (item.getItemId()) {
                  case R.id.action_search:
                      // Not implemented here
                      return false;
                  default:
                      break;
              }
              searchView.setOnQueryTextListener(queryTextListener);
              return super.onOptionsItemSelected(item);
          }
      }
      

      完成

      【讨论】:

      • 嘿!我正在使用您的代码,但我的搜索按钮没有展开/显示搜索文本编辑字段,知道吗?
      • @LucaNicoletti 因为您忘记在您的 OnCreateView() 中添加充气机,请查看此 return inflater.inflate(R.layout.fragment_main, container, false);
      • 不适合我!在我的情况下,完成此操作的唯一方法是使用接口:stackoverflow.com/a/37965747/1259763
      • 即使您在 onCreateOptionsMenu() 中分配 OnQueryTextListener 也可以正常工作,因此您不必覆盖 onOptionsItemSelected()。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-07
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-29
      相关资源
      最近更新 更多