Обработка элементов меню NavigationViewer

У меня есть NavigationViewer деятельность, которая имеет 3 фрагмента. Я хочу, чтобы каждый раз, когда пользователь выбирает элемент из NavigationViewerВ скользящих пунктах меню приложение выполнит новый фрагментный объект выбранного вида.

Например, у меня есть NavigationViewer пункт меню под названием "MyFragment", поэтому я пытаюсь этот код для этого пункта:

MyFragment myFragment = new MyFragment();
fragmentTransaction.replace(R.id.RR, myFragment , "nav_MyFragment ").commit();

Но это вызывает проблему, заключающуюся в том, что если пользователь выбрал "MyFragment" из меню, когда он активен (виден пользователю), он создаст новый объект. и я хочу создать этот новый объект, только если он совершает транзакции из одного фрагмента в другой.

Какие-либо предложения?

Изменить: получение фрагмента по тегу, а затем проверка, если isVisble() или если isAdded() дает нулевое исключение

3 ответа

Решение

Вы можете сохранить переменную Fragment и назначить там свой активный фрагмент, а затем проверить getClassName(), и, если он нажат, совпадает с тем, который вы отображаете в данный момент, вы не загружаете новый.

Я собираюсь использовать код из этого приложения у меня в GitHub.

Затем в вашей деятельности объявите переменную Fragment следующим образом:

Fragment active;

В вашем методе onOptionsItemSelected() вы должны выполнить проверку для нажатого элемента.

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();
    //noinspection SimplifiableIfStatement
    if (id == R.id.nav_item1) {
        if (active.getClass().getSimpleName().equals("FragmentA")) {
            // then this fragment is already being shown, therefore do nothing
        } else {
            FragmentA fragtoadd = new FragmentA();
            getFragmentManager().beginTransaction()
                                .remove(fragtoadd)
                                .commit();
            active = fragtoadd; // the magic is here, everytime you add a new fragment, keep the reference to it to know what fragment is being shown
        }
        return true;
    } else if (id == R.id.nav_item2) {
        // do the same as above but for FragmentB, and so on
        return true;
    } 
    // ... check all your items
    return super.onOptionsItemSelected(item);
}

Если у вас есть свой код в Github, чтобы я мог посмотреть, было бы лучше. Надеюсь, поможет!

Я предполагаю, что вы можете обнаружить фактические клики по элементам, поэтому я делаю так:

private static final String TAG_FRAGMENT_SOME_NAME = "something";

mFragmentManager = getSupportFragmentManager(); // or getFragmentManager() if not using support library
mFragmentTransaction = mFragmentManager.beginTransaction();
Fragment myFragment = mFragmentManager.findFragmentByTag(TAG_FRAGMENT_SOME_NAME);
if (myFragment == null) {
    myFragment = MyFragment.newInstance();
}
mFragmentTransaction.replace(R.id.RR, myFragment, TAG_FRAGMENT_SOME_NAME).commit();

Вы должны добавить экземпляр фрагмента в backstack

getSupportedFragmentManager.addToBackStack (fragment.gettag)

Другие вопросы по тегам