【问题标题】:Android get ID of current fragmentAndroid获取当前片段的ID
【发布时间】:2016-02-25 20:33:32
【问题描述】:

我实现了一个导航抽屉,但问题是当按下后退按钮时,绘图中的选中项与当前片段不对应(仅通过导航抽屉实际添加的最后一个片段)

这里有一个解决方案:Updating the Navigation Drawer (with DrawerLayout) when back button is pressed

解决方案如下:

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 中的变化,如果检测到,则获取当前片段的 id(在布局文件中定义)并将其传递给navigationView.setCheckedItem() 以自动检查相应的导航物品。像这样的:

navigationView = (NavigationView) findViewById(R.id.nav_view);

navigationView.setCheckedItem(R.id.nav_new);

在我的 mainactivity 类中,如何以 R.id.xxx 的形式获取当前片段的 id,以便将其传递给 setCheckedItem

【问题讨论】:

  • 为什么不使用String.equals 而不是== 来比较字符串?
  • 嗯,是的,但那不是我的代码。我正在尝试找到一种方法来完全消除该条件块

标签: android android-layout android-fragments android-navigation


【解决方案1】:

你可以这样做

在添加片段时这样做

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

注意:当您在FragmentManager.BackStackEntry 上使用getName() 时,您将传递给addToBackStack 的任何内容都会返回给您

【讨论】:

  • 我在添加到 backstack 时附加了 id,并完全使用了上面的代码,但在 try 块期间我一直遇到数字格式异常。我认为这是因为 stackName 看起来像 NewFragment2131492999。 parseInt 实际上会跳出字符吗?我想不出异常的另一个原因
  • 好的,我在parseInt() 中使用stackName.replaceAll("[\\D]", "") 修复了它
  • 我不明白为什么它会有额外的字符串。根据文档,它应该准确返回传递的内容。你的片段是NewFragment吗?
  • 这是因为当我添加到后台时我正在做addToBackStack(fragment.getClass().getSimpleName() + id)
  • 哦...谢天谢地,文档没有错。我想知道发生了什么事。 :D
【解决方案2】:
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();
}
}

【讨论】:

    猜你喜欢
    • 2021-12-15
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 2011-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多