如何阻止在每次活动调用中重新创建标签

时间:2016-08-26 15:17:42

标签: java android android-fragments

我的应用程序有一个索引页面,其中包含用于导航的选项卡。此页面有多个子页面作为片段实现。 enter image description here

我的一些儿童片段视图中还包含选项卡,以便进行更多导航,如下所示 enter image description here

我遇到的问题是当我从其中一个片段切换到另一个片段并返回到它时。那个片段上的标签被重新创建,就像这样 enter image description here 我不知道如何解决这个问题,因为这是我第一次认真对待这个问题。

以下是顶级标签适配器的代码

public class indexTabAdapter  extends FragmentPagerAdapter
{

    private List<String> titleList;
    private List<Fragment> fragmentList;


    public indexTabAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList)
    {
        super(fm);
        this.fragmentList = fragmentList;
        this.titleList = titleList;

    }

    @Override
    public Fragment getItem(int position)
    {

        return fragmentList.get(position);
    }

    @Override
    public int getCount()
    {

        return fragmentList.size();

    }

    @Override
    public CharSequence getPageTitle(int position)
    {
        return titleList.get(position);
    }
}

下面是管理顶级标签

的活动类的代码
  @Override
    protected void onCreate(@Nullable Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index_page);

        pager = (ViewPager) findViewById(R.id.indexViewPager);
        tabLayout = (TabLayout)findViewById(R.id.indexTabs);

        prepareDataResource();

        indexTabAdapter ita = new indexTabAdapter(getSupportFragmentManager(),fragmentList,titleList);

        pager.setAdapter(ita);
        tabLayout.setupWithViewPager(pager);

        ita.notifyDataSetChanged();



    }

    private void prepareDataResource()
    {
        fragmentList.add(new dash());
        titleList.add("Dash");

        fragmentList.add(new AcademicCalender());
        titleList.add("Calender");

        fragmentList.add(new IncidentReport());
        titleList.add("Incident Report");

        fragmentList.add(new Profile());
        titleList.add("Profile");

        fragmentList.add(new Pta());
        titleList.add("PTA");

        fragmentList.add(new timeTable());
        titleList.add("Time Table");

        fragmentList.add(new Results());
        titleList.add("Results");
    }

最后,这是不断重复的低级选项卡的代码

public class Profile extends Fragment
{
    private List<String> titleList = new ArrayList<>();
    private List<Fragment> fragmentList = new ArrayList<>();
    private ViewPager pager;
    private TabLayout tabLayout;

    public Profile()
    {

    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        View view = inflater.inflate(R.layout.profile_view_activity,container,false);


        pager = (ViewPager) view.findViewById(R.id.profileViewPager);

        tabLayout = (TabLayout) view.findViewById(R.id.profileTabs);

        prepareDataResource();

        profileTabsAdapter rta = new  profileTabsAdapter(getFragmentManager(),fragmentList,titleList);

        pager.setAdapter(rta);
        tabLayout.setupWithViewPager(pager);

        return view;
    }

    private void prepareDataResource()
    {
        fragmentList.add(new index());
        titleList.add("Home");

        fragmentList.add(new immunization());
        titleList.add("Immunization");

        fragmentList.add(new information());
        titleList.add("Information");

        fragmentList.add(new records());
        titleList.add("Health Records");


    }
}

2 个答案:

答案 0 :(得分:2)

FragmentPagerAdapter将您的片段实例化一次。因此,如果在将其声明为字段时实例化列表,它将始终保留相同的列表,从而在调用片段onCreateView时添加元素。

为避免这种情况,请声明并实例化两个列表:

public class Profile extends Fragment {
    private List<String> titleList;
    private List<Fragment> fragmentList;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
    {
        //your code for views initialization

        //init the lists here!
        titleList = new ArrayList<>();
        fragmentList = new ArrayList<>();

        prepareDataResource();

        //your adapter set up code

        return view;
    }

答案 1 :(得分:-3)

如果您正在使用viewPager.setOffscreenPageLimit(numberOfTabs),请尝试拨打setOffscreenPageLimit(int limit) 。我不是百分百肯定这会起作用,但尝试也不会有害。

来自官方Android文档:

{{1}}
     
    

设置应保留在页面两侧的页数     处于空闲状态的视图层次结构中的当前页面。