Java 如何阻止在每次活动调用时重新创建选项卡

Java 如何阻止在每次活动调用时重新创建选项卡,java,android,android-fragments,Java,Android,Android Fragments,我有一个应用程序,它有一个索引页,其中有用于导航的选项卡。此页面具有多个子页面,这些子页面被实现为片段。 我的一些子片段视图中也有选项卡,以便进行更多导航,如下所示 我遇到的问题是,当我从一个片段切换到另一个片段并返回到它时,其中一个片段上的选项卡会像这样重新创建 我不知道如何解决这个问题,因为这是我第一次认真对待标签 下面是我的顶级选项卡适配器代码 public class indexTabAdapter extends FragmentPagerAdapter { priva

我有一个应用程序,它有一个索引页,其中有用于导航的选项卡。此页面具有多个子页面,这些子页面被实现为片段。

我的一些子片段视图中也有选项卡,以便进行更多导航,如下所示

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

下面是我的顶级选项卡适配器代码

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);
    }
}
最后,这是不断重复的低级选项卡的代码

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");


    }
}
公共类概要文件扩展了片段
{
私有列表标题列表=新的ArrayList();
私有列表fragmentList=新的ArrayList();
私人寻呼机;
私人摊位摊位;
公众简介()
{
}
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
视图=充气机。充气(右布局。纵断面图活动,容器,错误);
pager=(ViewPager)view.findViewById(R.id.profileViewPager);
tabLayout=(tabLayout)view.findviewbyd(R.id.profileTabs);
prepareDataResource();
profileTabsAdapter rta=新的profileTabsAdapter(getFragmentManager(),fragmentList,titleList);
寻呼机设置适配器(rta);
tabLayout.setupWithViewPager(寻呼机);
返回视图;
}
私有无效预处理taresource()
{
添加(新索引());
标题列表。添加(“主页”);
添加(新免疫());
标题列表。添加(“免疫”);
添加(新信息());
标题列表。添加(“信息”);
添加(新记录());
标题列表。添加(“健康记录”);
}
}

如果您使用的是
ViewPager
,请尝试调用
ViewPager.setOffscreenPageLimit(numberOfTabs)
。我不是百分之百肯定这会奏效,但试试也无妨

来自Android官方文档:

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


如果您使用的是
ViewPager
,请尝试调用
ViewPager.setOffscreenPageLimit(numberOfTabs)
。我不是百分之百肯定这会奏效,但试试也无妨

来自Android官方文档:

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


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;
    }
公共类概要文件扩展了片段{
私人列表标题列表;
私有列表碎片列表;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
//视图初始化的代码
//在这里初始化列表!
titleList=新的ArrayList();
fragmentList=新的ArrayList();
prepareDataResource();
//您的适配器设置代码
返回视图;
}

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;
    }
公共类概要文件扩展了片段{
私人列表标题列表;
私有列表碎片列表;
@凌驾
CreateView上的公共视图(布局、充气机、视图组容器、捆绑包保存状态)
{
//视图初始化的代码
//在这里初始化列表!
titleList=新的ArrayList();
fragmentList=新的ArrayList();
prepareDataResource();
//您的适配器设置代码
返回视图;
}

添加该片段初始化的代码,以及您用于顶级选项卡ViewPager的适配器。请使用您的代码更新问题,因为这将帮助社区成员帮助您。ArrayList出现问题。正在重新初始化。@RamithDR现在已添加代码。如果您需要更多详细信息,请告诉我格式化添加片段初始化的代码,以及您用于顶级选项卡ViewPager的适配器。请使用您的代码更新问题,因为它将帮助社区成员帮助您。ArrayList出现问题。它再次初始化。@RamithDR现在已添加代码。如果您需要更多信息,请告诉我信息
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;
    }