Android получить идентификатор текущего фрагмента
У меня реализован навигационный ящик, но проблема в том, что при нажатии кнопки "Назад" отмеченный элемент на чертеже не соответствует текущему фрагменту (только последний фрагмент, который был фактически добавлен через навигационный ящик)
Существует решение для этого здесь: Обновление Навигационного Ящика (с DrawerLayout) при нажатии кнопки назад
Решение гласит следующее:
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentManager fm = getSupportFragmentManager();
String stackName = null;
for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
stackName = fm.getBackStackEntryAt(entry).getName();
Log.i("BC", "stackEntry" + entry);
}
if (stackName == "Fragment1"){
mDrawerList.setItemChecked(0, true);
} else if (stackName == "Fragment2") {
mDrawerList.setItemChecked(1, true);
}
});
Проблема с этим является условной. Необходимость вручную изменять индекс элемента навигации, который нужно проверить, является болью, когда у вас много элементов
То, что я хочу сделать, это прослушать изменение в backstack, и, если обнаружено, получить идентификатор текущего фрагмента (как определено в файле макета) и передать его до navigationView.setCheckedItem()
для автоматической проверки соответствующего элемента навигации. Что-то вроде этого:
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setCheckedItem(R.id.nav_new);
В моем классе mainacctivity, как я могу получить идентификатор текущего фрагмента в форме R.id.xxx
так что я могу передать это setCheckedItem
?
2 ответа
Вы могли бы сделать это
При добавлении фрагмента сделайте это
FragmentTransaction.addToBackStack(""+R.id.nav_new); // Use the id of navigation item which was clicked.
затем
getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {
@Override
public void onBackStackChanged() {
FragmentManager fm = getSupportFragmentManager();
String stackName = null;
for(int entry = 0; entry < fm.getBackStackEntryCount(); entry++){
stackName = fm.getBackStackEntryAt(entry).getName();
Log.i("BC", "stackEntry" + entry);
}
int navItemId = -1;
try{
navItemId = Integer.parseInt(stackName);
} catch(NumberFormatException nfe) {
}
if(navItemId > 0){
navigationView = (NavigationView) findViewById(R.id.nav_view);
navigationView.setCheckedItem(navItemId);
}
else
Log.e("", "Couldn't find the id");
});
ПРИМЕЧАНИЕ: все, что вы пройдете в addToBackStack
будет возвращен вам обратно, когда вы будете использовать getName()
на FragmentManager.BackStackEntry
you can handle it manually.
Make a function in base class to highlight desired item like
mDrawerList.setItemChecked(INDEX NUMBER, true);
Trick is make a model class for side menu items in which INDEX NUMBER is saved.
When you replace new fragment call that function and store currentFragment a well.
and when you press back button ovverides
public boolean onKeyDown(int keyCode, KeyEvent event) {}
and call below function
public void popAFragment(){
FragmentManager fragmentManager = getSupportFragmentManager();
if(fragmentManager != null){
int c = fragmentManager.getBackStackEntryCount();
if(c>0){
currentFragment = (BaseFragment) fragmentManager.getFragments().get(c-1);
fragmentManager.popBackStack();
setPosition(currentFragment.INDEX_NUMBER);
}
else {
finish();
}
}