2016-04-09 2 views
4

У меня есть аналогичный макет вкладки с 4 вкладками.Android | stop TabLayout перезагрузить/обновить мои фрагменты

enter image description here

Когда я иду от Вкладка 0 на вкладку 2, а затем я вернусь к вкладке 0, Fragment0 перезагружается .. Та же проблема, когда я иду с закладками «прочь ".
Я хотел бы загрузить Фрагмент только в первый раз и повторно использовать их, без перезагрузки.

Это часть моего кода (я с помощью this tutorial):

MyActivity:

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.my_activity); 

    toolbar = (Toolbar) findViewById(R.id.toolbar); 
    setSupportActionBar(toolbar); 

    if(getSupportActionBar()!=null) { 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
    } 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { 
     Window window = MyActivity.this.getWindow(); 
     window.addFlags(WindowManager.LayoutParams.FLAG_DRAWS_SYSTEM_BAR_BACKGROUNDS); 
     window.clearFlags(WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS); 
     window.setStatusBarColor(ContextCompat.getColor(MyActivity.this, R.color.colorPrimaryDark)); 
    } 

    viewPager = (ViewPager) findViewById(R.id.viewpager); 
    setupViewPager(viewPager); 

    tabLayout = (TabLayout) findViewById(R.id.tabs); 
    tabLayout.setSelectedTabIndicatorColor(Color.parseColor("#FFFFFF")); 
    tabLayout.setupWithViewPager(viewPager); 
    setupTabIcons(); //I have only icon, not text. 
} 

private void setupViewPager(ViewPager viewPager) { 
    ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    adapter.addFragment(MyFragment.newInstance(0)); 
    adapter.addFragment(MyFragment.newInstance(1)); 
    adapter.addFragment(new DifferentFragment()); 
    adapter.addFragment(new TestFragment()); 
    viewPager.setAdapter(adapter); 
} 

class ViewPagerAdapter extends FragmentPagerAdapter { 
    private final List<Fragment> mFragmentList = new ArrayList<>(); 

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

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

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

    public void addFragment(Fragment fragment) { 
     mFragmentList.add(fragment); 
    } 

    @Override 
    public CharSequence getPageTitle(int position) { 
     return null; 
    } 
} 

my_activity.xml:

<?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:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.design.widget.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/tabs" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      app:tabMode="fixed" 
      app:tabGravity="fill"/> 
    </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> 

ответ

3

Я решил это сам Простой, использование:

viewPager.setOffscreenPageLimit(numberOfPages); 

Из справки: Установите количество страниц, которые должны быть сохранены в обе стороны от текущей страницы в иерархии представлений в нерабочем состоянии ,

В моем случае, мне нужно страницы, которые должны быть сохранены.

0

ViewPager держит Фрагменты слева и/или справа от выбранной вкладки. Это необходимо для быстрой смены анимированных вкладок.

Вы можете хранить ссылки на свои фрагменты в своей деятельности, но эти ссылки могут быть пустыми.

+0

Как я могу держать ссылки моих фрагментов? Тогда я проверяю, является ли null (и я загружаю его). –

9

Как вы можете увидеть в документации setOffscreenPageLimit

Внутри вашей функции setupViewPager (ViewPager ViewPager) добавить следующее:

viewPager.setOffscreenPageLimit(limitNumberOfPages); //before setAdapter 
viewPager.setAdapter(adapter); 

И limitNumberOfPages является INT, который содержит количество страниц, которые можно прокручивать без перезагрузки фрагментов. Если у вас есть 4 вкладки, вы должны использовать:

int limitNumberOfPages = 3; 

номер по умолчанию для этого свойства 1.

+0

Спасибо, но я уже решил сам! :) –

+0

этот ответ помог мне +1 –

+0

Это помогло мне. Спасибо alot –

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