所以我需要一个选项菜单,该菜单在所有片段上都相同。此代码用于从选项菜单中选择和加载片段。但是,众所周知,仅仅因为某些事情有效并不意味着它是正确的方法。
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Fragment fragment = null;
switch (item.getItemId()) {
case R.id.navigation_home:
fragment = new HomeFragment();
break;
}
任何人和所有反馈都将非常感激。另外,您在什么时候使用一项新活动呢?
答案 0 :(得分:1)
如果每次加载时都需要在那些片段中重新加载数据,那么这是正确的方法。
但是,如果您一次只需要设置数据,则需要使用标记处理片段,并在加载片段时检查该标记,以检查其是否已存在于容器视图中。
像这样替换片段:
MyFragment fragment = new MyFragment();
FragmentManager fragmentManager = getSupportFragmentManager();
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.place_holder,fragment,"myFragmentTag");
fragmentTransaction.commit();
在此if
括号中包装上面的代码。
fragment = (MyFragment) getSupportFragmentManager().findFragmentByTag("myFragmentTag");
if(fragment == null){
// ok, fragment is not already exists, so load it once.
} else {
// Pop fragments to this tag
fm = getSupportFragmentManager();
for (int i = 0; i < getSupportFragmentManager().getBackStackEntryCount()-1; i--) {
if (!fm.getBackStackEntryAt(i).getName().equalsIgnoreCase(newFragTag)){
fm.popBackStack();
} else {
break;
}
}
}
最终代码看起来像
FragmentManager fragmentManager = getSupportFragmentManager();
fragment = (MyFragment) fragmentManager.findFragmentByTag("myFragmentTag");
if(fragment == null){
// ok, fragment is not already exists, so load it once.
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
fragmentTransaction.add(R.id.place_holder,fragment,"myFragmentTag");
fragmentTransaction.commit();
} else {
// Pop fragments to this tag
for (int i = 0; i < fragmentManager.getBackStackEntryCount()-1; i--) {
if (!fragmentManager.getBackStackEntryAt(i).getName().equalsIgnoreCase("myFragmentTag")){
fragmentManager.popBackStack();
} else {
break;
}
}
}
答案 1 :(得分:0)
您做对了。没什么大不了的。对于该活动,请尝试按您的设计模式将它们分开。就像您使用MVP
一样,您可以根据实体来分隔活动。但它仍然更多地取决于您正在创建的项目类型。同样,只要管理好许多活动以避免内存泄漏并尽可能少使用资源,这也没错。