疯狂使用Android Fragment Transaction

时间:2017-06-08 20:44:25

标签: android fragment tabbar fragmenttransaction

我无法理解我的片段事务的这种行为。在我发疯之前,有人可以请他干预。在我的MainActivity中,我正确设置了它:

    private final GuideFragment guideFragment = new GuideFragment();
    private final MapFragment mapFragment = new MapFragment();
    private final MoreFragment moreFragment = new MoreFragment();

    Fragment active;

    private BottomNavigationView.OnNavigationItemSelectedListener mOnNavigationItemSelectedListener
                = new BottomNavigationView.OnNavigationItemSelectedListener() {

            @Override
            public boolean onNavigationItemSelected(@NonNull MenuItem item) {
                FragmentTransaction transaction = getFragmentManager().beginTransaction();
                switch (item.getItemId()) {
                    case R.id.navigation_guide:
                        if (!guideFragment.isAdded()) {
                            transaction.add(R.id.content,guideFragment).commit();
                            active = guideFragment;
                            Log.d(TAG, "add Fragment1");
                            break;
                        } else {
                            transaction.hide(active).show(guideFragment).commit();
                            active = guideFragment;
                            Log.d(TAG, "show Fragment1");
                            break;
                        }
                    case R.id.navigation_map:
                        if (!mapFragment.isAdded()) {
                            transaction.add(R.id.content, mapFragment).commit();
                            active = mapFragment;
                            Log.d(TAG,"add Fragment2");
                            break;
                        } else {
                            transaction.hide(active).show(mapFragment).commit();
                            active = mapFragment;
                            Log.d(TAG,"show Fragment2");
                            break;
                        }
                    case R.id.navigation_more:
                        if (!moreFragment.isAdded()) {
                            transaction.add(R.id.content,moreFragment).commit();
                            active = moreFragment;
                            Log.d(TAG,"add Fragment3");
                            break;
                        } else {
                            transaction.hide(active).show(moreFragment).commit();
                            active = moreFragment;
                            Log.d(TAG,"show Fragment3");
                            break;
                        }
                }

                return true;
            }

        };

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_start);

        //start with guide view/fragment
        switchTabView(R.id.navigation_guide);

    }

    //method to start or switch a tab
    private void switchTabView(int itemId) {
        navigation = (BottomNavigationView) findViewById(R.id.navigation);
        navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener);
        navigation.setSelectedItemId(itemId);

    }

我的应用程序有3个选项卡,如上所示:Tab1(指南)Tab2(地图)Tab3(更多)。

当应用程序启动时,会添加第一个选项卡(指南)并正确显示。 然后我点击Map(下一个片段),添加并正确显示。 最后在更多标签(我的第三个标签)上,一切都很棒。

但是当活动启动并且我点击1-3(地图指南)到目前为止正确 - 然后3-2(更多选项卡到地图选项卡)都很好 - 但然后从2-1 (地图到指南)回来突然显示第3个选项卡片段(更多)显示指南片段应该在哪里。

有人知道出了什么问题? 希望得到一些帮助。

解决方案感谢Mateus

transaction.hide(fragment3).hide(fragment2).show(fragment1).commit();

我不确定是否调用两次隐藏片段是干净但我认为有3个标签它仍然没问题。有了更多选项卡,我会考虑以不同的方式处理它,例如remove()或replace()片段。

更新 - 解决方案比预期更棘手:

           switch (item.getItemId()) {
                case R.id.navigation_guide:
                    if (!guideFragment.isAdded()) {
                        transaction.add(R.id.content,guideFragment).commit();
                        Log.d(TAG, "add Fragment1");
                        break;
                    } else {
                        if (!moreFragment.isAdded() && mapFragment.isAdded()) {
                            transaction.hide(mapFragment).show(guideFragment).commit();
                        }
                        if (moreFragment.isAdded() && !mapFragment.isAdded()) {
                            transaction.hide(moreFragment).show(guideFragment).commit();
                        }
                        if (moreFragment.isAdded() && mapFragment.isAdded()) {
                            transaction.hide(moreFragment).hide(mapFragment).show(guideFragment).commit();
                        }

                        Log.d(TAG, "show Fragment1");
                        break;
                    }
                case R.id.navigation_map:
                    if (!mapFragment.isAdded()) {
                        transaction.add(R.id.content, mapFragment).commit();
                        Log.d(TAG,"add Fragment2");
                        break;
                    } else {
                        if (!moreFragment.isAdded()) {
                            transaction.hide(guideFragment).show(mapFragment).commit();
                        } else {
                            transaction.hide(guideFragment).hide(moreFragment).show(mapFragment).commit();
                        }
                        Log.d(TAG,"show Fragment2");
                        break;
                    }
                case R.id.navigation_more:
                    if (!moreFragment.isAdded()) {
                        transaction.add(R.id.content,moreFragment).commit();
                        Log.d(TAG,"add Fragment3");
                        break;
                    } else {
                        if (!mapFragment.isAdded()) {
                            transaction.hide(guideFragment).show(moreFragment).commit();
                        } else {
                            transaction.hide(guideFragment).hide(mapFragment).show(moreFragment).commit();
                        }
                        Log.d(TAG,"show Fragment3");
                        break;
                    }
            }

最后没有bug,你必须检查是否添加了其他片段!

2 个答案:

答案 0 :(得分:3)

当你从2回到1时,这一行将被调用:

transaction.hide(active).show(guideFragment).commit();

问题是当你隐藏活动(片段2)并显示片段1时,片段3(在片段1之后添加,因此在片段1的“顶部”)仍然显示。您还必须在Fragment 3上调用hide来查看Fragment 1。

换句话说,您需要调整代码以在每次要显示特定片段时隐藏所有其他片段。

同时检查this discussion关于在show / hide和add / remove / replace之间进行选择,以确认第一个策略更适合您的需求。

答案 1 :(得分:1)

当我想在同一个活动中转到另一个片段时,我使用它:

FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

transaction.replace(R.id.container,yourFragment);
transaction.commit();

Container是您活动中的布局。用它来显示你的片段。 此外,您必须在每个bottomNavigationView FragmentTransaction对象的情况下初始化!

我相信这就是你要找的!