处理 NavigationViewer 菜单项单击

Handling NavigationViewer Menu Items click

我有一个 NavigationViewer activity,它有 3 个片段。我希望每次用户从 NavigationViewer 滑动菜单项中选择一个项目时,应用程序都会处理所选种类的新片段对象。

例如,我有一个名为 "MyFragment" 的 NavigationViewer 菜单项 所以我在那个项目上尝试这个代码:

MyFragment myFragment = new MyFragment();
fragmentTransaction.replace(R.id.RR, myFragment , "nav_MyFragment ").commit();

但这会导致一个问题,如果用户在菜单处于活动状态时从菜单中选择 "MyFragment" [对用户可见],它将创建一个新对象。 我只想在从某个片段交易到另一个片段时创建那个新对象。

有什么建议吗?

编辑:通过标签检索片段,然后检查 isVisble()isAdded() 是否给出空异常

你必须将片段实例添加到后台堆栈

getSupportedFragmentManager.addToBackStack(fragment.gettag)

我假设您可以检测到实际的项目点击,所以我所做的是:

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

你可以保留一个 Fragment 变量并在那里分配你的活动片段,然后检查 getClassName() 如果它被点击的与你当前显示的相同,你就不会加载新的.

我将使用我在 github 中的 this 应用程序中的代码。

然后在你的 Activity 中声明一个像这样的 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里让我看看就更好了。 希望对您有所帮助!