@coden55

Работа с одним searchview из разных фрагментов?

Имеется mainActivity с NavigationDrawer и Toolbar.
Активити переключает разные фрагменты.
Во многих фрагментах должен быть реализован поиск, в некоторых - нет.
SearchView вынесен в тулбар.

Чтобы не прописывать для каждого фрагмента свой поиск я вынес все это в onCreateOptionsMenu mainActivity.

Вопрос: каким образом и где следует скрывать и показывать SearchView при смене фрагментов и как вызвать метод текущего фрагмента при подтверждении поиска?

Чтобы было понятнее выложу немного кода:
@Override
    public boolean onCreateOptionsMenu(final Menu menu) {
        Log.d(LOG_TAG, "onCreateOptionsMenu");
        getMenuInflater().inflate(R.menu.menu_main, menu);
        connectionStatus = menu.findItem(R.id.connectionStatus);

        searchItem = menu.findItem( R.id.action_search);
        final SearchView searchView = (SearchView) searchItem.getActionView();
        // make blinking cursor
        final EditText searchTextView = (EditText) searchView.findViewById(android.support.v7.appcompat.R.id.search_src_text);
        try {
            Field mCursorDrawableRes = TextView.class.getDeclaredField("mCursorDrawableRes");
            mCursorDrawableRes.setAccessible(true);
            mCursorDrawableRes.set(searchTextView, 0); //This sets the cursor resource ID to 0 or @null which will make it visible on white background
        } catch (Exception ignored) {}
        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                if( ! searchView.isIconified()) {
                    //todo call current fragment's method
                    searchView.setIconified(true);
                }
                searchItem.collapseActionView();
                return false;
            }
            @Override
            public boolean onQueryTextChange(String s) {
                return false;
            }
        });
        //hide overflow menu button when expanded
        MenuItemCompat.setOnActionExpandListener(searchItem, new MenuItemCompat.OnActionExpandListener() {
            @Override
            public boolean onMenuItemActionCollapse(MenuItem item) {
                setItemsVisibility(menu, searchItem, true);
                return true;
            }

            @Override
            public boolean onMenuItemActionExpand(MenuItem item) {
                setItemsVisibility(menu, searchItem, false);
                return true;
            }
        });

        return super.onCreateOptionsMenu(menu);
    }


navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(MenuItem menuItem) {

                if (menuItem.isChecked()) menuItem.setChecked(false);
                else menuItem.setChecked(true);

                drawerLayout.closeDrawers();

                Fragment fragment = null;

                switch (menuItem.getItemId()) {
                    case R.id.map:
                        fragment = new Fragment_Map();
                        //show search
                        break;
                    case R.id.subscribers:
                        fragment = new Fragment_Subscribers();
                        //show disable search
                        break;
                    case R.id.customlists:
                        fragment = new Fragment_AccessUserlists();
                        break;
                    case R.id.entities:
                        break;
                    case R.id.layers:
                        fragment = new Fragment_Layers();
                        break;
                    case R.id.messages:
                        break;
                    case R.id.profile:
                        break;
                    case R.id.settings:
                        break;
                    case R.id.logout:
                        App_WeOnMap.getAuthenticator().doLogout();
                        Intent intent = new Intent(Activity_Main.this, Activity_Login.class);
                        startActivity(intent);
                        finish();
                        break;
                    case R.id.closeapp:
                        finish();
                        break;
                    default:
                        break;
                }

                if (fragment != null) {
                    fragment.setRetainInstance(true);
                    FragmentManager fragmentManager = getFragmentManager();
                    fragmentManager.beginTransaction().replace(R.id.frame, fragment).commit();
                }
                return true;
            }
        });
  • Вопрос задан
  • 547 просмотров
Пригласить эксперта
Ответы на вопрос 1
Rou1997
@Rou1997
Прямо при смене Fragment'ов и скрывайте, там же сохраняйте текущий Fragment для обращений к нему.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы