Android获取当前片段的ID
我实现了一个导航抽屉,但问题是当按下“后退”按钮时,绘图中的选中项与当前片段不对应(只有通过导航抽屉实际添加的最后一个片段) 这里有一个解决方案: 该解决方案规定如下:Android获取当前片段的ID,android,android-layout,android-fragments,android-navigation,Android,Android Layout,Android Fragments,Android Navigation,我实现了一个导航抽屉,但问题是当按下“后退”按钮时,绘图中的选中项与当前片段不对应(只有通过导航抽屉实际添加的最后一个片段) 这里有一个解决方案: 该解决方案规定如下: getSupportFragmentManager().addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() { @Override public void onBackStac
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);
}
});
在我的mainactivity类中,如何以R.id.xxx
的形式获取当前片段的id,以便将其传递给setCheckedItem
?您可以这样做
在添加片段时,请执行以下操作
FragmentTransaction.addToBackStack(""+R.id.nav_new); // Use the id of navigation item which was clicked.
然后
getSupportFragmentManager().AddOnBackbackChangedListener(新的FragmentManager.OnBackbackChangedListener()){
@凌驾
BackbackChanged()上的公共无效{
FragmentManager fm=getSupportFragmentManager();
字符串stackName=null;
对于(int entry=0;entry0){
navigationView=(navigationView)findViewById(R.id.nav_视图);
navigationView.setCheckedItem(navItemId);
}
其他的
Log.e(“,”找不到id”);
});
注意:当您使用
getName()时,您将在addToBackStack
中传递的内容将返回给您FragmentManager.BackStackEntry
为什么不使用String.equals
而不是=
来比较字符串?好吧,是的,那不是我的代码。我试图找到一种方法来消除条件块。我在添加到backstack时附加了id,并使用了上面的代码,但我保留了它在try块期间遇到数字格式异常。我想这是因为stackName看起来像newFragment213149299
。parseInt是否确实会使字符出错?我想不出出现异常的另一个原因。我在parseInt()中使用stackName.replaceAll([\\D],“”)
我不明白为什么它会有额外的字符串。根据文档,它应该准确地返回传递的内容。您的碎片类是新碎片
?这是因为当我添加到backbackback时,我正在执行addToBackStack(fragment.getClass().getSimpleName()+id)
哦……谢天谢地,文档没有错。我想知道发生了什么事。:D
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();
}
}
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");
});
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();
}
}