Android ViewPager-在片段页面中创建新片段

Android ViewPager-在片段页面中创建新片段,android,android-layout,android-fragments,android-viewpager,material-design,Android,Android Layout,Android Fragments,Android Viewpager,Material Design,我有一个ViewPager活动。ViewPager还有一个表格布局,带有3个选项卡:FragmentA、FragmentB和FragmentC,每个选项卡对应于ViewPager中显示的3个页面中的一个。在FragmentB的内部,虽然我会有一个按钮。我现在需要能够点击这个按钮并创建一个新片段,fragmented,它将取代FragmentB。这个新片段需要有一个带有返回箭头的操作栏,这样它就可以返回到FragmentB。在所有这些过程中,选项卡仍应显示FragmentB是活动选项卡。我已经研究

我有一个
ViewPager
活动。
ViewPager
还有一个
表格布局
,带有3个选项卡:
FragmentA
FragmentB
FragmentC
,每个选项卡对应于
ViewPager
中显示的3个页面中的一个。在
FragmentB
的内部,虽然我会有一个按钮。我现在需要能够点击这个按钮并创建一个新片段,
fragmented
,它将取代
FragmentB
。这个新片段需要有一个带有返回箭头的操作栏,这样它就可以返回到
FragmentB
。在所有这些过程中,选项卡仍应显示
FragmentB
是活动选项卡。我已经研究了嵌套的片段,但无法使其工作。我还尝试从片段中创建对viewpager活动的引用,并使用新片段的位置调用getItem方法,但这不起作用。这是我现在的代码。这是一个创建
查看页面的活动。在
ViewPager
3个片段的内部,还创建了
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;
        }
    }


}
公共类MyActivity扩展了AppCompatActivity{
查看页面查看页面;
PagerAdapter PagerAdapter;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
//获取ViewPager并将其设置为PagerAdapter,以便它可以显示项目
viewPager=(viewPager)findViewById(R.id.viewPager);
pagerAdapter=新的pagerAdapter(getSupportFragmentManager(),MyActivity.this);
viewPager.setAdapter(pagerAdapter);
viewPager.setOffscreenPageLimit(3);
//将视图页导航提供给表格布局
TabLayout TabLayout=(TabLayout)findViewById(R.id.tab_布局);
tabLayout.setupWithViewPager(viewPager);
//迭代所有选项卡并设置自定义视图
for(int i=0;i
我想这是有目的的吧

public Fragment[] fragments = new Fragment[tabTitles.length];
您只指定它,但从不使用它的元素


您可以这样使用它来懒洋洋地创建片段

@Override
public Fragment getItem(int position) {
    Fragment f = fragments[position];

    if (f == null) {
        switch (position) {
            case 0:
                f = new MyFragmentA();
                break;
            case 1:
                f = new MyFragmentB();
                break;
            case 2:
                f = new MyFragmentC();
                break;
        }
        fragments[position] = f;
    }

    return f;
}
或者看看这里,这是没有正确实现的,因为
super.instanceItem(container,position)
从未创建您想要的三个片段类中的任何一个

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Fragment createdFragment = (Fragment) super.instantiateItem(container, position);
        fragments[position]  = createdFragment;
        return createdFragment;
    }
所以,我将在这里删除该方法

在FragmentB的内部,我会有一个按钮。我现在需要能够点击这个按钮,并有一个新的片段创建,碎片,这将取代碎片B。。。在所有这些过程中,选项卡仍应显示FragmentB是活动选项卡

您需要从
FragmentB
回调到活动中

然后,在活动回调中,您可以创建并可能“替换
ViewPager
的第2页”

这个新片段需要有一个带有返回箭头的操作栏,这样它就可以返回到FragmentB


您还需要在该界面中使用第二种方法,即
onBackPressed
ViewPager

中重新创建和加载
FragmentB
over
FragmentD
,您每次都返回片段的新实例,只需将其存储在列表中并使用适当的参数返回即可position@Nas对不起,我不知道你在说什么什么意思?因此,我创建了3个片段,例如new MyFragmentC()。你是说在这里创建第四个片段并将其放入案例3中,就像案例3:return myfragmented()?如果是这样的话,我该如何从MyFragmentB中获取这个新片段,并使其成为一个“子片段”,这样我就可以导航回来?因此在MyFragmentB中,我有一个按钮,需要调用一个片段,这是我的问题。当调用此命令时,我需要加载MyFragmentD。当它被加载时,它应该充当MyFragmentB的“子项”,因此该选项卡仍然显示MyFragmentB被选中,但MyFragmentD被显示