在标签android

时间:2017-08-07 07:41:06

标签: java android android-fragments

我的应用程序有一个底部导航栏,有5个标签。 所以根据这些标签,我有5个片段 当我单击选项卡时,片段根据该选项卡进行了更改。 我可以使用beginTransaction()方法切换片段。替换... 我不希望每次切换标签时都会破坏并重新创建片段,所以我的解决方案就像这样

//I init 5 fragments
Fragment1 frag1 = new Fragment1();
Fragment2 frag2 = new Fragment2();
Fragment3 frag3 = new Fragment3();
Fragment4 frag4 = new Fragment4();
Fragment5 frag5 = new Fragment5();

//When I click on tab, for example tab1, I hide all fragments except tab1
//hide all fragments
getSupportFragmentManager()
                    .beginTransaction()
                    .hide(fragment1) //Fragment2, 3, 4, 5 as well
                    .commit();

//show fragment 1
getSupportFragmentManager()
                    .beginTransaction()
                    .show(fragment1)
                    .commit();

它工作得很好,但问题是有时两个片段一次显示(我不知道为什么因为我隐藏了所有片段) 任何其他方式来实现这一目标?切换片段而不破坏它并再次创建它。

4 个答案:

答案 0 :(得分:2)

用于添加片段我为我的项目制作了这段代码,希望它会有所帮助。

 public static void replaceFragment(Fragment fragment, FragmentManager fragmentManager) {
        String backStateName = fragment.getClass().getName();
        String fragmentTag = backStateName;


        Fragment currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
        Log.e("Current Fragment", "" + currentFrag);

//        boolean fragmentPopped = fragmentManager.popBackStackImmediate(backStateName, 0);
        int countFrag = fragmentManager.getBackStackEntryCount();
        Log.e("Count", "" + countFrag);


        if (currentFrag != null && currentFrag.getClass().getName().equalsIgnoreCase(fragment.getClass().getName())) {
            return;
        }


        FragmentTransaction ft = fragmentManager.beginTransaction();
//        if (!fragmentPopped) {

        ft.replace(R.id.frame_container, fragment);
        ft.addToBackStack(backStateName);
        ft.commit();
//        }

        currentFrag = fragmentManager.findFragmentById(R.id.frame_container);
        Log.e("Current Fragment", "" + currentFrag);


    }

希望这对您有所帮助,并在整个项目中使用此方法替换片段。

答案 1 :(得分:1)

在这种情况下,ViewPager使用FragmentPagerAdapter适合您。

然后使用ViewPager#setOffsetPageLimit(5)。这将帮助您显示/隐藏片段,而无需再次重新创建它。

关注此tutorial

试一试,然后告诉我你的问题是否得到解决。 ;)

答案 2 :(得分:0)

你不需要隐藏片段就像这个方法一样替换片段:

example :
object structure ready to inserted to new object
{id:null,custname:null,etc} 

* initial data :
this.state = {
   visitPlan:[]
}

}

答案 3 :(得分:0)

尝试在单一交易中进行。

protected void showAsRootFragment(Fragment fragment, @NonNull String tag) {
    FragmentManager supportFragmentManager = getSupportFragmentManager();        
    FragmentTransaction transaction = supportFragmentManager.beginTransaction();
    if (supportFragmentManager.getFragments() != null) {
        for (Fragment attachedFragment : supportFragmentManager.getFragments()) {
            if (attachedFragment != null && !tag.equals(attachedFragment.getTag())) {
                transaction.hide(attachedFragment);
                attachedFragment.setUserVisibleHint(false);
            }
        }
    }

    if (!fragment.isAdded()) {
        transaction.add(R.id.frame_container, fragment, tag);
        fragment.setUserVisibleHint(true);
    } else {
        transaction.show(fragment);
        fragment.setUserVisibleHint(true);
    }

    transaction.commit();
}