【问题标题】:actionbar search will not close after search搜索后操作栏搜索不会关闭
【发布时间】:2014-05-29 02:57:15
【问题描述】:

我有一个带有搜索图标的操作栏。单击搜索图标时,它会展开为搜索栏,用户可以在其中键入搜索内容。

问题是当用户输入搜索时,我希望搜索栏折叠回图标,但我一生都无法实现。

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

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

我的搜索活动如下所示:

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();

    }



}

【问题讨论】:

    标签: android android-actionbar


    【解决方案1】:

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

    searchView.setQuery("", false);
    searchView.setIconified(true);
    

    这会使 SearchView 在搜索后崩溃。

    【讨论】:

    • searchView.setQuery("", false); 这成功了
    【解决方案2】:

    经过一番搜索,我找到了解决方案。 onActionViewCollapsed 有效,但是您遇到了意外行为(图标跳到左侧,向上指示符仍然在这里...)- 在我的第一个和上一个答案中提出了这个(硬)解决方案,我是通过使用collapseActionView 方法说服。但是,SearchView.collapseActionView() 不起作用,因为根据Documentation

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

    它与MenuItem 相关,而不是SearchView 小部件。这就是为什么您在使用此方法时遇到此错误的原因:

    collapseActionView() 方法没有为 SearchView 类型定义

    那么,解决方法是创建一个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;
     }
    

    或者另一种可能是避免使用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);
    }  
    

    这肯定会解决问题。编码愉快!

    【讨论】:

    • 这样几乎可以完美运行,它按原样折叠但没有执行我的搜索...我的代码现在看起来像这样:gist.github.com/anonymous/cf26b36c5a22b64459b6
    • 这是因为您有两次查询侦听器。确保您删除了实现 OnQueryListener 并复制/粘贴所有内容(json 请求等)在您折叠视图的同一查询侦听器中。在上面的代码中,它为您提供了一个查询侦听器。你看到@Mike了吗?
    • 请参阅上面的更新答案。在注释行 “在此处调用您的请求” 处在侦听器中调用您的请求。 HTH @Mike
    • 刚试过,但不喜欢这一行的this:task.setOnArticleSelectedListener(this);
    • 谢谢 .. 你拯救了我的一天。上面的代码运行良好。
    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 2014-01-18
    • 2014-12-02
    • 2022-11-03
    相关资源
    最近更新 更多