我有一个NavigationViewer
活动,其中包含3个片段。我希望每当用户从NavigationViewer
滑动菜单项中选择一个项目时,应用程序将处理所选类型的新片段对象。
例如我有一个名为“MyFragment”的NavigationViewer
菜单项
所以我在这个项目上尝试这个代码:
MyFragment myFragment = new MyFragment();
fragmentTransaction.replace(R.id.RR, myFragment , "nav_MyFragment ").commit();
但是这会导致一个问题,如果用户在激活[菜单用户]时从菜单中选择“MyFragment”,它将创建一个新对象。 我只想在从一些片段到另一个片段进行交易时才创建新对象。
任何建议?
编辑:按标记检索片段,然后检查isVisble()
或isAdded()
是否为空例外
答案 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();