Android - 在Fragment ViewPager中保持SearchView打开

时间:2016-04-01 04:10:24

标签: android android-fragments android-viewpager

所以..我的Fragment包含ViewPager,其中还有两个Fragments,用作搜索标签。这意味着3个不同的Java类,1个用于容器,2个用于内容。

我想要的行为是:当用户按下搜索按钮,输入内容并在基础Activity中提交搜索时,应用会覆盖onQueryTextSubmit以启动寻呼机Fragment和在那里获取查询以直接搜索寻呼机中的第一个Fragment。当用户滑动到下一个Fragment时,SearchView会及其查询一直存在,并使用所述查询在第二个Fragment上执行搜索。

我得到的行为是..当用户滑动到下一个Fragment时,搜索菜单会折叠,关键字就会消失。

这是我对SearchVenu

中的Activity进行编码的方式
@Override
public boolean onQueryTextSubmit(String query) {
    searchFragment = new SearchFragment();
    Bundle searchBundle = new Bundle();
    keyword = searchView.getQuery().toString();
    searchBundle.putString("searchQuery", keyword);
    searchFragment.setArguments(searchBundle);
    backstackCount = manager.getBackStackEntryCount();
        if (backstackCount >= 2) {
            manager.executePendingTransactions();
            if (manager.getBackStackEntryAt(backstackCount - 1).getName().equals("searchTag")) {

            } else {
                replaceFragment(searchFragment, searchTag);
            }
        } else {
            replaceFragment(searchFragment, searchTag);
        }
return false;

适配器:

mAdapter = new MyPagerAdapter(getChildFragmentManager(), bundle);

...

private class MyPagerAdapter extends FragmentStatePagerAdapter {

    private Bundle fragmentBundle;

    public MyPagerAdapter(FragmentManager fm, Bundle data) {
        super(fm);
        fragmentBundle = data;
    }

    @Override
    public Fragment getItem(int pos) {
        /*Fragment f = new Fragment();
        f.setArguments(this.fragmentBundle);
        return f;*/

        switch(pos) {
            case 0: return SearchFriendFragment.newInstance(fragmentBundle);
            case 1: return SearchShopFragment.newInstance(fragmentBundle);
            default: return SearchFriendFragment.newInstance(fragmentBundle);
        }
    }

    @Override
    public CharSequence getPageTitle(int position) {
        return CONTENT[position % CONTENT.length];
    }

    @Override
    public int getCount() {
        //return 3;
        return CONTENT.length;
    }
}

这就是我在其中一个Fragments

中初始化搜索的方法
@Override
public void onPrepareOptionsMenu(Menu menu) {
    menu.clear();
    super.onPrepareOptionsMenu(menu);
    getActivity().getMenuInflater().inflate(R.menu.menu_search, menu);
    searchViewBtn = menu.findItem(R.id.menu_search);
    searchView = (SearchView) MenuItemCompat.getActionView(searchViewBtn);

我很清楚,menu.clear()会在切换Fragment时继续刷新菜单。但我不知道该如何做才能获得正确的行为..

更新menu_search.xml

    <item
    android:id="@+id/menu_search"
    android:orderInCategory="200"
    android:title="Search"
    android:icon="@drawable/iconcariheader"
    app:showAsAction="ifRoom"
    app:actionViewClass="android.support.v7.widget.SearchView"></item>

1 个答案:

答案 0 :(得分:0)

使用我的建议

    public boolean onOptionsItemSelected(MenuItem item)
 {
   switch(item.getItemId())
   {
    case R.id.menu_search:
    searchView = (SearchView) item.getActionView();
        searchView.setOnQueryTextListener
        (new SearchView.OnQueryTextListener() 
           {
                @Override
                public boolean onQueryTextSubmit(String query) {
                    // call your search function
                     return true;
                }

                @Override
                public boolean onQueryTextChange(String newText) {
                    // call your search function
                      return true;
                }
            });
          break;
     }
     return super.onOptionsItemSelected(item);
   }

希望这会有所帮助,让我知道更多。