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();
}
}