Android - setArguments 到 FragmentPagerAdapter 中的片段
Android - setArguments to fragment in FragmentPagerAdapter
我有一个 AppCompatActivity
,上面有一个名为 TabbedScoreboardFragment
、
的片段
在该片段中有一个 Tabbar Layout
和 ViewPager
,以及 class SectionsPagerAdapter
子 class 来自 FragmentPagerAdapter
。
那是我的SectionsPagerAdapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private static final String ME_FRAGMENT_TAG = "meFragment";
private static final String FRIENDS_FRAGMENT_TAG = "friendsFragment";
SectionsPagerAdapter(FragmentManager fm) { super(fm); }
@Override
public Fragment getItem(int position) {
if (position == 0) {
ScoreboardListFragment friendScoreboardListFragment = (ScoreboardListFragment) getChildFragmentManager().findFragmentByTag(FRIENDS_FRAGMENT_TAG);
if (friendScoreboardListFragment == null) {
friendScoreboardListFragment = ScoreboardListFragment.newInstance(UserType.friend);
}
return friendScoreboardListFragment;
} else {
ScoreboardListFragment meScoreboardListFragment = (ScoreboardListFragment) getChildFragmentManager().findFragmentByTag(ME_FRAGMENT_TAG);
if (meScoreboardListFragment == null) {
meScoreboardListFragment = ScoreboardListFragment.newInstance(UserType.me);
}
return meScoreboardListFragment;
}
}
@Override
public int getCount() {
return 2;
}
}
问题从这里开始:
我正在尝试设置我传递给 getItem
函数的其中一个片段的参数,但我无法获取片段本身,因为它不是 FragmentTransaction
具有 replace
功能,因此它可以使用标签,使用我的标签我可以识别片段,获取它并触发功能 setArguments(Bundle bundle)
我在 TabbedScoreboardFragment
中尝试做的是:
public class TabbedScoreboardFragment extends Fragment {
private static final String ME_FRAGMENT_TAG = "meFragment";
private static final String FRIENDS_FRAGMENT_TAG = "friendsFragment";
private ViewPager viewPager;
private SectionsPagerAdapter sectionsPagerAdapter;
enum UserType {
me, friend
}
public static TabbedScoreboardFragment newInstance() {
return new TabbedScoreboardFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tabbed_scoreboard, container, false);
this.viewPager = view.findViewById(R.id.container);
this.sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
this.viewPager.setAdapter(this.sectionsPagerAdapter);
TabLayout tabLayout = view.findViewById(R.id.tabs);
this.viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(this.viewPager));
this.viewPager.setCurrentItem(1);
return view;
}
@Override
public void setArguments(Bundle args) {
ArrayList<MyScores.MyScore> myScores = args.getParcelableArrayList("myScores");
if (myScores != null) {
for (int i = 0; i < this.sectionsPagerAdapter.getCount(); i++) {
if (this.sectionsPagerAdapter.getItem(i) instanceof ScoreboardListFragment) {
ScoreboardListFragment item = (ScoreboardListFragment) this.sectionsPagerAdapter.getItem(i);
Bundle myScoresBundle = new Bundle();
myScoresBundle.putParcelableArrayList("myScores", myScores);
item.setArguments(myScoresBundle);
}
}
} else {
super.setArguments(args);
}
}
}
但是当我在做的时候this.sectionsPagerAdapter.getItem(i)
它总是创建 ScoreboardListFragment
的新实例,而不是使用和检索现有实例。
感谢各位帮手!
当您尝试传递参数时,并非所有内部片段都已创建。
当您是 creating/showing 片段
时,您将不得不以另一种方式或 "ask" 传递数据
首先,您不应该在获取项目类型中创建片段,因为每次片段 l 出现在屏幕上时您都在重新创建片段。
您应该做的是使用片段列表启动适配器,这样您就可以拥有两个以上的片段,但片段也只会初始化一次,因此实例与您使用 setArgs 初始化它们时相同。
我有一个 AppCompatActivity
,上面有一个名为 TabbedScoreboardFragment
、
在该片段中有一个 Tabbar Layout
和 ViewPager
,以及 class SectionsPagerAdapter
子 class 来自 FragmentPagerAdapter
。
那是我的SectionsPagerAdapter
public class SectionsPagerAdapter extends FragmentPagerAdapter {
private static final String ME_FRAGMENT_TAG = "meFragment";
private static final String FRIENDS_FRAGMENT_TAG = "friendsFragment";
SectionsPagerAdapter(FragmentManager fm) { super(fm); }
@Override
public Fragment getItem(int position) {
if (position == 0) {
ScoreboardListFragment friendScoreboardListFragment = (ScoreboardListFragment) getChildFragmentManager().findFragmentByTag(FRIENDS_FRAGMENT_TAG);
if (friendScoreboardListFragment == null) {
friendScoreboardListFragment = ScoreboardListFragment.newInstance(UserType.friend);
}
return friendScoreboardListFragment;
} else {
ScoreboardListFragment meScoreboardListFragment = (ScoreboardListFragment) getChildFragmentManager().findFragmentByTag(ME_FRAGMENT_TAG);
if (meScoreboardListFragment == null) {
meScoreboardListFragment = ScoreboardListFragment.newInstance(UserType.me);
}
return meScoreboardListFragment;
}
}
@Override
public int getCount() {
return 2;
}
}
问题从这里开始:
我正在尝试设置我传递给 getItem
函数的其中一个片段的参数,但我无法获取片段本身,因为它不是 FragmentTransaction
具有 replace
功能,因此它可以使用标签,使用我的标签我可以识别片段,获取它并触发功能 setArguments(Bundle bundle)
我在 TabbedScoreboardFragment
中尝试做的是:
public class TabbedScoreboardFragment extends Fragment {
private static final String ME_FRAGMENT_TAG = "meFragment";
private static final String FRIENDS_FRAGMENT_TAG = "friendsFragment";
private ViewPager viewPager;
private SectionsPagerAdapter sectionsPagerAdapter;
enum UserType {
me, friend
}
public static TabbedScoreboardFragment newInstance() {
return new TabbedScoreboardFragment();
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_tabbed_scoreboard, container, false);
this.viewPager = view.findViewById(R.id.container);
this.sectionsPagerAdapter = new SectionsPagerAdapter(getChildFragmentManager());
this.viewPager.setAdapter(this.sectionsPagerAdapter);
TabLayout tabLayout = view.findViewById(R.id.tabs);
this.viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout));
tabLayout.addOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(this.viewPager));
this.viewPager.setCurrentItem(1);
return view;
}
@Override
public void setArguments(Bundle args) {
ArrayList<MyScores.MyScore> myScores = args.getParcelableArrayList("myScores");
if (myScores != null) {
for (int i = 0; i < this.sectionsPagerAdapter.getCount(); i++) {
if (this.sectionsPagerAdapter.getItem(i) instanceof ScoreboardListFragment) {
ScoreboardListFragment item = (ScoreboardListFragment) this.sectionsPagerAdapter.getItem(i);
Bundle myScoresBundle = new Bundle();
myScoresBundle.putParcelableArrayList("myScores", myScores);
item.setArguments(myScoresBundle);
}
}
} else {
super.setArguments(args);
}
}
}
但是当我在做的时候this.sectionsPagerAdapter.getItem(i)
它总是创建 ScoreboardListFragment
的新实例,而不是使用和检索现有实例。
感谢各位帮手!
当您尝试传递参数时,并非所有内部片段都已创建。 当您是 creating/showing 片段
时,您将不得不以另一种方式或 "ask" 传递数据首先,您不应该在获取项目类型中创建片段,因为每次片段 l 出现在屏幕上时您都在重新创建片段。 您应该做的是使用片段列表启动适配器,这样您就可以拥有两个以上的片段,但片段也只会初始化一次,因此实例与您使用 setArgs 初始化它们时相同。