5

Witam Mam TabLayout i ViewPager wewnątrz fragmentu. Ale nie mogę przesuwać między kartami, aby przejść do fragmentu podrzędnego (działa normalnie w działaniu, ale nie działa w jego fragmencie).TabLayout z ViewPager nie działa wewnątrz fragmentu Android

Oto mój kod Tablayout wewnątrz fragmentu:

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

    } 

wątpię, mam problem z tej linii:

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

Anyhelp jest znacznie docenić, dzięki

+0

proszę spróbować jako viewPager.setAdapter (nowy CustomAdapter (getSupportFragmentManager(), getContext())); // getSupportFragmentManager() lub getChildFragmentManager() –

+0

Wygląda na to pytanie ma wszystko, co chcesz. http://stackoverflow.com/q/34015117/2404262 –

+0

Dzięki za odpowiedź. Próbowałem obu, ale nie działałem. W każdym razie, aby tablayout i ViewPager działały w fragmentach tak samo jak w działaniu? –

Odpowiedz

6

Zrobiłem podobny projekt i oto mój kod do fragmentu:

@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

Wielkie dzięki. Rozwiązaniem jest użycie getchildFragmentManager. Ale nadal mam 1 pytanie, które powinniśmy umieścić cały plik wykonywalny wewnątrz OncreateView lub przenieść niektóre do OnActivityCreated? Chcę, aby fragment był wykonywany tylko wtedy, gdy użytkownik przesunie się do tego fragmentu [teraz wszystkie fragmenty ładują się w tym samym czasie, –

+0

powinieneś nadmuchać swoje widoki w 'onCreateView()' i zrobić dowolne przetwarzanie, które chcesz zrobić w 'onCreateView() 'lub' onActivityCreated() '. Po prostu pamiętaj o zrobieniu 'if (isAdded()) przed czymkolwiek, co nazywasz' getActivity() ' –

+0

Nadal mylę pomieszanie getContext i getActivity. Kiedy użyć jednego z nich? Czy masz przykład na ładowanie fragmentów tylko wtedy, gdy użytkownik się do nich poślizgnie? –

Powiązane problemy