搜索后,操作栏搜索不会关闭

Mik*_*ike 16 android android-actionbar

我有一个带搜索图标的操作栏.单击搜索图标后,它将扩展到用户可以键入搜索的搜索栏.

问题是,当用户输入搜索时,我希望搜索栏折叠回图标,但我无法让它在我的生活中发生.

我的操作栏菜单如下所示:

<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=".MainActivity" >

    <item android:id="@+id/menu_search2"
        android:actionViewClass="android.widget.SearchView"
        android:title="Search"
        android:icon="@android:drawable/ic_menu_search"
        android:showAsAction="always|collapseActionView|"
        android:onClick="goToSearch"
        />

    <item android:id="@+id/action_scan"
        android:icon="@drawable/barcode"
        android:onClick="scanBarcode"
        android:showAsAction="ifRoom|collapseActionView"
        />

</menu>
Run Code Online (Sandbox Code Playgroud)

我的搜索活动如下:

public class Search extends Fragment implements SearchView.OnQueryTextListener, ReadJSONResult.OnArticleSelectedListener {

    private ListView lv;
    View v;
    SearchView searchView;
    private SearchView mSearchView;
    private MenuItem mSearchMenuItem;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        //set layout here
        v = inflater.inflate(R.layout.activity_search, container, false);
        setHasOptionsMenu(true);
        getActivity().setTitle("Search");


        //get user information
        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(getActivity());
        String userName = prefs.getString("userName", null);
        String userID = prefs.getString("userID", null);


        return v;


}

    @Override
    public void onCreateOptionsMenu (Menu menu, MenuInflater inflater) {
        // Inflate the menu; this adds items to the action bar if it is present.

        searchView = (SearchView) menu.findItem(R.id.menu_search2).getActionView();
        searchView.setOnQueryTextListener(this);
        searchView.setIconified(false);
    }


    public boolean onQueryTextSubmit (String query) {

        //toast query
        //make json variables to fill
        searchView.setIconified(true);
        searchView.clearFocus();

        // url to make request
        String url = "myURL";



        try {
            query = URLEncoder.encode(query, "UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


        String jsonUrl = url + query;


        //todo: get json
        ReadJSONResult task = new ReadJSONResult(getActivity());
        task.setOnArticleSelectedListener(this);
        task.execute(jsonUrl);

        return false;
    }





    @Override
    public boolean onQueryTextChange(String newText) {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public void onArticleSelected(String b, String brewery){
        searchView.setIconified(true);
        searchView.clearFocus();
        searchView.postInvalidate();
        //code to execute on click
        Fragment Fragment_one;
        FragmentManager man= getFragmentManager();
        FragmentTransaction tran = man.beginTransaction();

        //adds beer data to shared prefs for beer tabs
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getActivity());
        SharedPreferences.Editor editor = preferences.edit();
        editor.putString("beerID",b);
        editor.putString("breweryID",brewery);
        editor.commit();
        Fragment_one = new BeerTabs();

        tran.replace(R.id.main, Fragment_one);//tran.
        tran.addToBackStack(null);
        tran.commit();

    }



}
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 33

一种更简单的方法,即使SearchView小部件不在操作栏上也可以使用以下代码:

searchView.setQuery("", false);
searchView.setIconified(true);
Run Code Online (Sandbox Code Playgroud)

这使得SearchView在搜索完成后崩溃.


fll*_*llo 14

经过一些搜索,我找到了解决方案.该onActionViewCollapsed作品,但你有一个意外的行为(图标跳转到左,上指示灯还在这里......)-这(硬)解决方案在我的第一个和前面的答案建议,我被利用的说服collapseActionView方法.但是,SearchView.collapseActionView()因为根据文档:

折叠与此菜单项关联的操作视图.

它与小部件有关,而MenuItemSearchView小部件无关.这就是您使用此方法时出现此错误的原因:

对于SearchView类型,方法collapseActionView()未定义

然后,解决方案是创建一个Menu变量,如下所示:

 // At the top of your class
 private Menu mMenu;

 // onCreateOptionsMenu method
 @Override
 public boolean onCreateOptionsMenu(Menu menu) {
      this.mMenu = menu; // init the variable
      // other stuff..
      return true;
 }

 // call the collapseActionView method
 public boolean onQueryTextSubmit(String query) {
      searchView.setIconified(true);
      searchView.clearFocus();
      // call your request, do some stuff..

      // collapse the action view
      if (mMenu != null) { 
          (mMenu.findItem(R.id.menu_search2)).collapseActionView();
      }
      return false;
 }
Run Code Online (Sandbox Code Playgroud)

或者另一个可能是避免工具SearchView.OnQueryTextListener并在内部执行onCreateOptionsMenu如下:

@Override
// make your Menu as 'final' variable
public void onCreateOptionsMenu (final Menu menu, MenuInflater inflater) {
    searchView = (SearchView) menu.findItem(R.id.menu_search2).getActionView();
    // call the query listener directly on the SearchView
    searchView.setOnQueryTextListener(new OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String query) {
            searchView.setIconified(true);
            searchView.clearFocus();

            // call the request here

            // call collapse action view on 'MenuItem'
            (menu.findItem(R.id.menu_search2)).collapseActionView();

            return false;
        }
        @Override
        public boolean onQueryTextChange(String newText) { return false; }
    });
    searchView.setIconified(false);
}  
Run Code Online (Sandbox Code Playgroud)

这肯定会解决问题.快乐的编码!