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;
}