在 ViewPager 中多次调用同一片段
Same fragment called multiple time in ViewPager
我有一个查看寻呼机。用户可以选择他可以拥有多少个不同的页面。
这些页面都是相同的布局,只是会加载不同的数据。
这是我的片段适配器:
public class FragmentAdapter extends FragmentPagerAdapter
{
private final List<Fragment> lstFragment = new ArrayList<>();
private final List<String> lstTitles = new ArrayList<>();
public FragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
return lstFragment.get(i);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return lstTitles.get(position);
}
@Override
public int getCount() {
return lstTitles.size();
}
public void AddFragment (Fragment fragment , String title)
{
lstFragment.add(fragment);
lstTitles.add(title);
}
}
这里是多次调用片段的代码:
FragAdapter = new FragmentAdapter(getSupportFragmentManager());
viewPager = (ViewPager) findViewById(R.id.main_tabs_pager);
toolbar = (Toolbar) findViewById(R.id.main_page_toolbar);
tabLayout = (TabLayout) findViewById(R.id.main_tabs);
String[] Fragments = {"Frag1", "Frag2", "Frag3", "Frag4"};
for (int i=0; i<Fragments.length; i++)
{
((FragmentAdapter) FragAdapter).AddFragment(new MenuFragment(),Fragments[i]);
}
viewPager.setAdapter(FragAdapter);
tabLayout = (TabLayout) findViewById(R.id.main_tabs);
tabLayout.setupWithViewPager(viewPager);
所以它工作正常。但唯一的问题是我不知道如何知道不同片段之间的代码差异。
例子:
frag1必须加载5张关于大海的图片
frag2必须加载8张关于太阳的图片
我如何告诉片段要做什么?我试图通过示例
在构造函数中传递参数
public MenuFragment(int numberofpictures, String picturesthemes)
{
// Required empty public constructor
}
但构造函数必须为空,因为当片段被销毁并重新创建时它不会被再次调用...
有人有想法吗?谢谢
更新
我不知道这是不是好方法,但我是这样做的:
在主要 activity 我创建了:
for (int i=0; i<Fragments.length; i++)
{
Bundle parameters = new Bundle();
parameters.putInt("myInt", i);
Fragment menuFragment = new MenuFragment();
menuFragment.setArguments(parameters);
((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);
}
它给每个片段一个 int i ,它是对标题的引用。
然后我简单地写了这个函数:
public String getName (int i)
{
return Fragments[i];
}
哪个 return 标题基于片段因捆绑包获得的 int
然后,在 MenuFragment() 中我使用了这个:
private void fillinthelist()
{
myInt = getArguments().getInt("myInt");
String test = ((MainActivity) getActivity()).getName(myInt);
ListOfProgrammes.add(new Modele_carte(test));
}
所以它从 bundle 中获取了 int 并且由于 MainActivity
中的函数而喜欢它
这样做的好方法吗?好像有用
您可以附上一个 Bundle
包含参数 setArguments(Bundle) :
Bundle parameters = new Bundle();
parameters.putInt("myInt", <int_value>);
Fragment menuFragment = new MenuFragment();
menuFragment.setArguments(arguments);
((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);
常见的做法是在片段的 class 静态工厂方法中构建和附加 Bundle。
片段可以使用getArguments()来检索参数。
private int myInt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myInt = getArguments().getInt("myInt");
}
我有一个查看寻呼机。用户可以选择他可以拥有多少个不同的页面。 这些页面都是相同的布局,只是会加载不同的数据。
这是我的片段适配器:
public class FragmentAdapter extends FragmentPagerAdapter
{
private final List<Fragment> lstFragment = new ArrayList<>();
private final List<String> lstTitles = new ArrayList<>();
public FragmentAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
return lstFragment.get(i);
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return lstTitles.get(position);
}
@Override
public int getCount() {
return lstTitles.size();
}
public void AddFragment (Fragment fragment , String title)
{
lstFragment.add(fragment);
lstTitles.add(title);
}
}
这里是多次调用片段的代码:
FragAdapter = new FragmentAdapter(getSupportFragmentManager());
viewPager = (ViewPager) findViewById(R.id.main_tabs_pager);
toolbar = (Toolbar) findViewById(R.id.main_page_toolbar);
tabLayout = (TabLayout) findViewById(R.id.main_tabs);
String[] Fragments = {"Frag1", "Frag2", "Frag3", "Frag4"};
for (int i=0; i<Fragments.length; i++)
{
((FragmentAdapter) FragAdapter).AddFragment(new MenuFragment(),Fragments[i]);
}
viewPager.setAdapter(FragAdapter);
tabLayout = (TabLayout) findViewById(R.id.main_tabs);
tabLayout.setupWithViewPager(viewPager);
所以它工作正常。但唯一的问题是我不知道如何知道不同片段之间的代码差异。
例子: frag1必须加载5张关于大海的图片 frag2必须加载8张关于太阳的图片
我如何告诉片段要做什么?我试图通过示例
在构造函数中传递参数 public MenuFragment(int numberofpictures, String picturesthemes)
{
// Required empty public constructor
}
但构造函数必须为空,因为当片段被销毁并重新创建时它不会被再次调用...
有人有想法吗?谢谢
更新
我不知道这是不是好方法,但我是这样做的:
在主要 activity 我创建了:
for (int i=0; i<Fragments.length; i++)
{
Bundle parameters = new Bundle();
parameters.putInt("myInt", i);
Fragment menuFragment = new MenuFragment();
menuFragment.setArguments(parameters);
((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);
}
它给每个片段一个 int i ,它是对标题的引用。 然后我简单地写了这个函数:
public String getName (int i)
{
return Fragments[i];
}
哪个 return 标题基于片段因捆绑包获得的 int
然后,在 MenuFragment() 中我使用了这个:
private void fillinthelist()
{
myInt = getArguments().getInt("myInt");
String test = ((MainActivity) getActivity()).getName(myInt);
ListOfProgrammes.add(new Modele_carte(test));
}
所以它从 bundle 中获取了 int 并且由于 MainActivity
中的函数而喜欢它这样做的好方法吗?好像有用
您可以附上一个 Bundle
包含参数 setArguments(Bundle) :
Bundle parameters = new Bundle();
parameters.putInt("myInt", <int_value>);
Fragment menuFragment = new MenuFragment();
menuFragment.setArguments(arguments);
((FragmentAdapter) FragAdapter).AddFragment(menuFragment, Fragments[i]);
常见的做法是在片段的 class 静态工厂方法中构建和附加 Bundle。
片段可以使用getArguments()来检索参数。
private int myInt;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
myInt = getArguments().getInt("myInt");
}