2015-03-18 3 views
0

У меня есть приложение с левым навигационным ящиком, переключающимся между различными фрагментами. Внутри одного из этих фрагментов я хочу реализовать SlidingTabLayout.Фрагмент с SlidingTabLayout

Итак, что я сделал, я скопировал SlidingTabLayout.java и SlidingTabStrip.java из приложения iosched от Google. Я использовал их в моем фрагменте:

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical"> 

    <mynamespace.widget.SlidingTabLayout 
     android:id="@+id/home_fragment_tabs" 
     android:background="?attr/colorPrimary" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"/> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/home_fragment_pager" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:layout_width="match_parent" /> 


</LinearLayout> 

И тогда в моем классе Фрагмент внутри метода onCreateView, я экземпляр моего пейджера и SlidingTabLayout вроде этого:

mPager = (ViewPager) view.findViewById(R.id.home_fragment_pager); 
     mPager.setAdapter(new HomePagerAdapter(getActivity().getSupportFragmentManager())); 
     mTabs = (SlidingTabLayout) view.findViewById(R.id.home_fragment_tabs); 
     mTabs.setViewPager(mPager); 

И это мой FragmentPagerAdapter:

class HomePagerAdapter extends FragmentPagerAdapter 
    { 
     private String[] tabs = { "Today", "This week", "With star" }; 
     private Fragment[] tabFragments = { 
       new TodayTabFragment(), 
       new WeekTabFragment(), 
       new StarTabFragment() 
     }; 

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

     @Override 
     public Fragment getItem(int i) 
     { 
      return tabFragments[i]; 
     } 

     @Override 
     public int getCount() 
     { 
      return 3; 
     } 

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

Также у меня есть отдельный класс Фрагмента и макет для каждой вкладки, что ничего особенного. И это работает, но как только я переключаюсь на другой фрагмент с помощью своего навигационного ящика, когда я возвращаюсь, содержимое одной из вкладок просто исчезает. В основном это происходит со второй вкладкой. Кроме того, если я выбираю HomeFragment навигации ящика, когда уже отображается, я получаю NullPointerException внутри SlidingTabLayout.java на этой линии: mViewPager.setCurrentItem(i);

Любой способ фиксации его? Я понятия не имею, что делать. Я думаю, мой код будет работать, но внутри деятельности. Можно заставить его работать внутри фрагмента?

+0

Можете ли вы дать кусок исходного кода активности, которая изменяет фрагменты? Не устанавливайте адаптеры в onCreateView, установите его в onActivityCreated ... –

+0

'@Override public void onNavigationDrawerItemSelected (int position) { { FragmentManager manager = getSupportFragmentManager(); manager.beginTransaction() .replace (R.id.main_content, фрагменты [позиция]) .commit(); } ' – Orochi

+1

Я думаю, что вы должны всегда создавать новый объект фрагмента (не использовать старые экземпляры-фрагменты [позиция]). Потому что, когда вы создаете новый экземпляр, вам гарантируется, что будут вызываться все жизненные циклы фрагментов (onCreate, onCreateView, onActivityCreated и т. Д.) (И, следовательно, будет создан новый экземпляр HomePagerAdapter) ... –

ответ

0

Решение:

То, что я сделал это вместо реализации FragmentPagerAdapter, я реализовал PagerAdapter я переопределен в (, ViewGroup контейнер Int позиций) метод instantiateItem и метод destroyItem().

Link, которые помогли мне: http://developer.android.com/samples/SlidingTabsBasic/src/com.example.android.slidingtabsbasic/SlidingTabsBasicFragment.html

0

Вы можете попытаться изменить конструктор HomePagerAdapter к:

public HomePagerAdapter(SupportFragmentManager fm) 
{ 
    super(fm); 
} 
1

Я также столкнулся с той же проблемой. Используйте FragmentStatePagerAdapter вместо FragmentPagerAdapter, который решит эту проблему.

0

Когда вы начинаете транзакцию вместо suuportfragmanager изменить его childfragmentmanager

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