0

我有ViewPager活动。 ViewPager也有一个TabLayout,带有3个选项卡:FragmentA,FragmentBFragmentC,每个对应于要在ViewPager中显示的3个页面之一。虽然我会有一个按钮,但在FragmentB里面。我现在需要能够点击这个按钮并创建一个新的片段,FragmentD,这将超过FragmentB。这个新的片段需要有一个带有后退箭头的操作栏,以便返回到FragmentB。在所有这些过程中,标签仍应显示FragmentB是活动标签。我已经研究过嵌套的碎片,但是我无法完成它的工作。我也尝试从我的片段创建一个对viewpager acitivty的引用,并调用getItem方法和我的新片段的位置,但这不起作用。这是我现在的代码。这是一项活动,创建ViewPager。在ViewPager 3片段内创建和TabLayout还创建:ViewPager - 在片段页面中创建一个新片段

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


} 
+0

负载FragmentBFragmentD您的片段返回新实例每次只是将其存储在列表和返回它与适当的位置 – Nas

+0

@Nas对不起,我不确定你的意思?所以我创建了3个片段,例如新的MyFragmentC()。你是说那么在这里创建一个第四个片段,并将其放入case 3(如情况3):return MyFragmentD()?如果是的话,我怎么从MyFragmentB中获得这个新的片段,并将它制作一个“孩子”,然后我可以导航回来? – user2924127

回答

0

我假设有这样一个目的是什么?

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.instantiateItem(container, position)实现永远不会创造任何你想要三个片段类。

@Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     Fragment createdFragment = (Fragment) super.instantiateItem(container, position); 
     fragments[position] = createdFragment; 
     return createdFragment; 
    } 

所以,我会删除该方法在这里

内FragmentB的,虽然我将有一个按钮。我现在需要能够点击这个按钮并创建一个新的片段FragmentD,它会超过FragmentB ...这些标签应该仍然显示FragmentB在所有这些过程中都是活动选项卡。

你需要从FragmentB一些回调到活动

How to implement OnFragmentInteractionListener

然后,在活动回调,您可以创建和ViewPager的都不可能“取代第2页”。

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

您还需要第二个方法在接口说onBackPressed重新创建,并在ViewPager

+0

所以在MyFragmentB我有一个按钮,将需要调用片段,这是我有问题。当这被称为我需要加载MyFragmentD。当它被加载时,它应该充当MyFragmentB的“孩子”,因此该选项卡仍显示选择了MyFragmentB,但显示了MyFragmentD。该片段还需要能够返回到MyFragmentB。 – user2924127

+0

好吧,所以1)'FragmentB'可以有'FragementInteractionListener'。 2)父Activity需要创建这个'FragmentD'并将其添加到某个视图中。当然,除非你明确地通过代码移动'ViewPager'选项,否则FragmentB仍然会被选中。 –

+0

我试图用FragmentTrasactions“替换”页面查看器的页面2,但无法使其工作。我将如何取代这个网页? – user2924127