5

Ciao Ho un TabLayout e ViewPager all'interno di un frammento. Ma non posso scorrere tra i tab per arrivare al frammento figlio (Lavorare normalmente quando si è in attività ma non lavorare in frammento).TabLayout con ViewPager che non funziona all'interno del frammento Android

Ecco il mio codice per Tablayout all'interno frammento:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 

     View inflateView = inflater.inflate(R.layout.fragment_assign_beacon_to_event, container, false); 

     //Viewpager and TabLayout 
     viewPager = (ViewPager)inflateView.findViewById(R.id.viewPager); 
     viewPager.setAdapter(new CustomAdapter(getFragmentManager(), getContext())); 

     tabLayout = (TabLayout)inflateView.findViewById(R.id.tabLayout); 


     // Inflate the layout for this fragment 
     return inflateView; 
    } 

@Override 
    public void onActivityCreated(Bundle savedInstanceState) { 
     super.onActivityCreated(savedInstanceState); 

    tabLayout.post(new Runnable() { 
       @Override 
       public void run() { 
        tabLayout.setupWithViewPager(viewPager); 

      } 
     }); 

     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 
       viewPager.setCurrentItem(tab.getPosition()); 
      } 
     }); 

Any here is my Custom Adapter class 

private class CustomAdapter extends FragmentPagerAdapter { 

     private String fragments[] = {"Assign Event", "Manage Event"}; 

     public CustomAdapter(FragmentManager supportFragmentManager, Context applicationContext) { 
      super(supportFragmentManager); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
//     return new AssignEventToBeacon(); 
        return new Test1(); 
       case 1: 
        return new ManageEventAssigned(); 
       default: 
        return null; 
      } 
     } 

     @Override 
     public int getCount() { 
      return fragments.length; 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return fragments[position]; 
     } 

    } 

dubito ho problema con questa linea:

viewPager.setAdapter(new CustomAdapter(getFragmentManager(), getContext())); 

Anyhelp è molto apprezzato, grazie

+0

si prega di provare come viewPager.setAdapter (nuovo CustomAdapter (getSupportFragmentManager(), getContext())); // getSupportFragmentManager() o getChildFragmentManager() –

+0

Guarda questa domanda ha tutto quello che vuoi. http://stackoverflow.com/q/34015117/2404262 –

+0

Grazie per la vostra risposta. Ho provato entrambi ma non ha funzionato. In ogni caso, fare tablayout e ViewPager funzionano in frammenti come nell'attività? –

risposta

6

Ho fatto un simile progetto e qui è il mio codice per il frammento:

@Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 
     View view = inflater.inflate(R.layout.outer_fragment, container, false); 
     setHasOptionsMenu(true); 

     ViewPager viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
     if (viewPager != null) { 
      setupViewPager(viewPager); 
     } 

     Log.v("Layout","Tabs"); 
     TabLayout tabLayout = (TabLayout) view.findViewById(R.id.tabs); 
     tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF")); 
     tabLayout.setTabTextColors(Color.parseColor("#707070"), Color.parseColor("#FFFFFF")); 
     assert viewPager != null; 
     tabLayout.setupWithViewPager(viewPager); 

     return view; 
    } 

private void setupViewPager(ViewPager viewPager) { 
     Adapter adapter = new Adapter(getChildFragmentManager()); 
     adapter.addFragment(new Tab1Fragment(), "PHOTOS"); 
     adapter.addFragment(new Tab2Fragment(), "HI-FIVES"); 
     viewPager.setAdapter(adapter); 
    } 


static class Adapter extends FragmentPagerAdapter { 
     private final List<Fragment> mFragments = new ArrayList<>(); 
     private final List<String> mFragmentTitles = new ArrayList<>(); 

     public Adapter(FragmentManager fm) { 
      super(fm); 
     } 

     public void addFragment(Fragment fragment, String title) { 
      mFragments.add(fragment); 
      mFragmentTitles.add(title); 
     } 

     @Override 
     public Fragment getItem(int position) { 
      return mFragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      return mFragments.size(); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return mFragmentTitles.get(position); 
     } 
    } 
+0

Grazie mille. La soluzione è che dovremmo usare getchildFragmentManager. Ma ho ancora 1 domanda che dovremmo inserire tutto il codice eseguibile in OncreateView o spostarlo in OnActivityCreated? Voglio che il frammento venga eseguito solo se l'utente scorre su quel frammento [ora tutti i frammenti caricano allo stesso tempo –

+0

dovresti gonfiare le tue viste in 'onCreateView()' e fare qualsiasi elaborazione tu voglia fare in 'onCreateView() 'o' onActivityCreated() '. Ricordati di fare 'if (isAdded())' prima di qualsiasi punto tu chiami 'getActivity()' –

+0

Im ancora confondere tra getContext e getActivity. Quando usare uno dei due? Hai un esempio per caricare il frammento solo quando l'utente scivola verso di loro? –