Обработка элементов меню 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)