处理NavigationViewer菜单项单击

时间:2016-04-26 18:28:05

标签: android android-fragments android-navigationview

我有一个NavigationViewer活动,其中包含3个片段。我希望每当用户从NavigationViewer滑动菜单项中选择一个项目时,应用程序将处理所选类型的新片段对象。

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

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

但是这会导致一个问题,如果用户在激活[菜单用户]时从菜单中选择“MyFragment”,它将创建一个新对象。 我只想在从一些片段到另一个片段进行交易时才创建新对象。

任何建议?

编辑:按标记检索片段,然后检查isVisble()isAdded()是否为空例外

3 个答案:

答案 0 :(得分:1)

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

我将使用github中的this app中的代码。

然后在你的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中有你的代码,那么我可以看看它会更好。 希望它有所帮助!

答案 1 :(得分:0)

你必须将片段实例添加到backstack中

getSupportedFragmentManager.addToBackStack(fragment.gettag)

答案 2 :(得分:0)

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

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