【发布时间】:2017-09-03 13:37:15
【问题描述】:
我有一个ViewPager 活动。 ViewPager 也有一个 TabLayout 和 3 个选项卡:FragmentA、FragmentB 和 FragmentC,每个对应于要在 ViewPager 中显示的 3 个页面之一。在FragmentB 里面虽然我会有一个按钮。我现在需要能够单击此按钮并创建一个新片段FragmentD,它将取代FragmentB。这个新片段需要有一个带有后退箭头的操作栏,以便它可以返回到FragmentB。在所有这些过程中,选项卡仍应显示FragmentB 是活动选项卡。我已经研究过嵌套片段,但我无法让它工作。我还尝试从我的片段创建对我的 viewpager 活动的引用,并使用我的新片段的位置调用 getItem 方法,但这不起作用。这是我现在的代码。这是一个创建ViewPager 的活动。在ViewPager3 内部创建了片段,同时还创建了TabLayout:
public class MyActivity extends AppCompatActivity {
ViewPager viewPager;
PagerAdapter pagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// Get the ViewPager and set it's PagerAdapter so that it can display items
viewPager = (ViewPager) findViewById(R.id.viewpager);
pagerAdapter = new PagerAdapter(getSupportFragmentManager(), MyActivity.this);
viewPager.setAdapter(pagerAdapter);
viewPager.setOffscreenPageLimit(3);
// Give the TabLayout the ViewPager
TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout);
tabLayout.setupWithViewPager(viewPager);
// Iterate over all tabs and set the custom view
for (int i = 0; i < tabLayout.getTabCount(); i++) {
TabLayout.Tab tab = tabLayout.getTabAt(i);
tab.setCustomView(pagerAdapter.getTabView(i));
}
}
class PagerAdapter extends FragmentPagerAdapter {
String tabTitles[] = new String[] { "FragmentA", "FragmentB", "FragmentC", };
public Fragment[] fragments = new Fragment[tabTitles.length];
Context context;
public PagerAdapter(FragmentManager fm, Context context) {
super(fm);
this.context = context;
}
@Override
public int getCount() {
return tabTitles.length;
}
@Override
public Fragment getItem(int position) {
switch (position) {
case 0:
return new MyFragmentA();
case 1:
return new MyFragmentB(); //Inside of fragment B I will have a button. If that button is clicked this fragment needs to be replaced with a new fragment temporarliy, FRAGMENTD, which will have an anctionbar to be able to go back to fragment B. The tabs should show that the user is technically still in FragmentB tab.
case 2:
return new MyFragmentC();
}
return null;
}
@Override
public CharSequence getPageTitle(int position) {
// Generate title based on item position
return tabTitles[position];
}
public View getTabView(int position) {
View tab = LayoutInflater.from(MyActivity.this).inflate(R.layout.custom_tab, null);
TextView tv = (TextView) tab.findViewById(R.id.custom_text);
tv.setText(tabTitles[position]);
return tab;
}
//This populates your Fragment reference array:
@Override
public Object instantiateItem(ViewGroup container, int position) {
Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
fragments[position] = createdFragment;
return createdFragment;
}
}
}
【问题讨论】:
-
您每次都返回片段的新实例,只需将其存储在列表中并以适当的位置返回
-
@Nas 抱歉,我不确定你的意思?所以我创建了 3 个片段,例如 new MyFragmentC()。您是说在此处创建第 4 个片段并将其放入案例 3 中,如案例 3: return MyFragmentD() 吗?如果是这样,我如何从 MyFragmentB 获取这个新片段并使其成为“子”,以便我可以导航回来?
标签: android android-layout android-fragments android-viewpager material-design