从“选项”菜单中加载片段的正确方法是什么?

时间:2019-06-22 02:56:57

标签: android android-fragments

所以我需要一个选项菜单,该菜单在所有片段上都相同。此代码用于从选项菜单中选择和加载片段。但是,众所周知,仅仅因为某些事情有效并不意味着它是正确的方法。

@Override
    public boolean onOptionsItemSelected(MenuItem item) {

            Fragment fragment = null;

            switch (item.getItemId()) {
                    case R.id.navigation_home:
                            fragment = new HomeFragment();
                            break;

                    }

任何人和所有反馈都将非常感激。另外,您在什么时候使用一项新活动呢?

2 个答案:

答案 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一样,您可以根据实体来分隔活动。但它仍然更多地取决于您正在创建的项目类型。同样,只要管理好许多活动以避免内存泄漏并尽可能少使用资源,这也没错。