处理 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里让我看看就更好了。
希望对您有所帮助!
我有一个 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里让我看看就更好了。 希望对您有所帮助!