4

Я пытаюсь добавить viewpager к фрагменту, используя новую библиотеку дизайна поддержки Android. У меня есть XML-код для макета следующим образом:ViewPager inside Fragment

<?xml version="1.0" encoding="utf-8"?> 
<android.support.design.widget.CoordinatorLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/coordinatorLayout" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.AppBarLayout 
     android:id="@+id/appBarLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"> 

     <android.support.v7.widget.Toolbar 
      android:id="@+id/toolbar" 
      android:layout_width="match_parent" 
      android:layout_height="?attr/actionBarSize" 
      android:background="?attr/colorPrimary" 
      app:layout_scrollFlags="scroll|enterAlways" 
      app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> 

     <android.support.design.widget.TabLayout 
      android:id="@+id/tabLayout" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" /> 

    </android.support.design.widget.AppBarLayout> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/viewpager" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     app:layout_behavior="@string/appbar_scrolling_view_behavior" /> 

</android.support.design.widget.CoordinatorLayout> 

И соответствующий класс Java выглядит следующим образом:

public class Tracks extends Fragment { 

    ViewPager viewPager; 
    TabLayout tabLayout; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.tracks, container, false); 

     viewPager = (ViewPager) view.findViewById(R.id.viewpager); 
     tabLayout = (TabLayout) view.findViewById(R.id.tabLayout); 

     AppCompatActivity activity = (AppCompatActivity) getActivity(); 
     assert activity.getSupportActionBar() != null; 
     activity.getSupportActionBar().setBackgroundDrawable(new ColorDrawable(getResources().getColor(R.color.app_theme))); 

     return view; 
    } 

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

     setupViewPager(viewPager); 
     tabLayout.setupWithViewPager(viewPager); 

     tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { 
      @Override 
      public void onTabSelected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabUnselected(TabLayout.Tab tab) { 

      } 

      @Override 
      public void onTabReselected(TabLayout.Tab tab) { 

      } 
     }); 
    } 

    private void setupViewPager(ViewPager viewPager) { 
     ViewPagerAdapter viewPagerAdapter = new ViewPagerAdapter(getChildFragmentManager()); 
     viewPagerAdapter.addFragment(new TopTracks(), "Top Tracks"); 
     viewPagerAdapter.addFragment(new WorldCharts(), "World Charts"); 
     viewPagerAdapter.addFragment(new NewMusic(), "New Music"); 
     viewPagerAdapter.addFragment(new AfricaHot(), "Africa Hot"); 
     viewPagerAdapter.addFragment(new Playlists(), "Playlists"); 
     viewPagerAdapter.addFragment(new Recommended(), "Recommended"); 
     viewPager.setAdapter(viewPagerAdapter); 
    } 

    private class ViewPagerAdapter extends FragmentPagerAdapter { 

     List<Fragment> fragmentList = new ArrayList<>(); 
     List<String> fragmentTitles = new ArrayList<>(); 

     public ViewPagerAdapter(FragmentManager fragmentManager) { 
      super(fragmentManager); 
     } 

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

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

     @Override 
     public CharSequence getPageTitle(int position) { 
      return fragmentTitles.get(position); 
     } 

     public void addFragment(Fragment fragment, String name) { 
      fragmentList.add(fragment); 
      fragmentTitles.add(name); 
     } 
    } 
} 

ViewPager работает правильно за исключением того, что мои закладки обыкновение показывать. Все, что я получаю следующий экран:

The tablayout is present but tabs are absent

Я прошел через код много раз, но я до сих пор не могу показаться, чтобы получить то, что случилось с моим кодом

+0

Если вы вернетесь в том же действии (например, попробуйте нажать квадратную кнопку и вернуться в том же приложении), будут показаны вкладки? –

+0

@Fondesa Никогда не пробовал это раньше, но да, они делают. Почему это? –

+0

Я сейчас отвечу, подождите –

ответ

4

Это общая ошибка с библиотекой поддержки проектирования связанные с ViewCompat.

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

    setupViewPager(viewPager); 
    // after you set the adapter you have to check if view is laid out, i did a custom method for it 
    if (ViewCompat.isLaidOut(tabLayout)) { 
     setViewPagerListener(); 
    } else { 
     tabLayout.addOnLayoutChangeListener(new View.OnLayoutChangeListener() { 
      @Override 
      public void onLayoutChange(View v, int left, int top, int right, int bottom, int oldLeft, int oldTop, int oldRight, int oldBottom) { 
       setViewPagerListener(); 
       tabLayout.removeOnLayoutChangeListener(this); 
      } 
     }); 
    } 
} 

private void setViewPagerListener() { 
    tabLayout.setupWithViewPager(viewPager); 
    // use class TabLayout.ViewPagerOnTabSelectedListener 
    // note that it's a class not an interface as OnTabSelectedListener, so you can't implement it in your activity/fragment 
    // methods are optional, so if you don't use them, you can not override them (e.g. onTabUnselected) 
    tabLayout.setOnTabSelectedListener(new TabLayout.ViewPagerOnTabSelectedListener(viewPager) { 
     @Override 
     public void onTabReselected(TabLayout.Tab tab) { 
      super.onTabReselected(tab); 
     } 

     @Override 
     public void onTabSelected(TabLayout.Tab tab) { 
      super.onTabSelected(tab); 
     } 
    }); 
} 
+0

Это сработало! Большое спасибо! –

+0

@AlexKombo Ницца! –

Смежные вопросы