0

Может кто-нибудь помочь мне понять, почему следующий бит кода работает на одном фрагменте, но не на другом, заставляя меня в два раза больше внутренних фрагментов, чем я должен был бы, и TabLayout и ViewPager рассинхронизироваться:ViewPager с вдвое большим количеством фрагментов, как и должно быть

Фрагмент:

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

    pagerAdapter = new MyPagerAdapter(getFragmentManager()); 

    tabLayout = (TabLayout)mainView.findViewById(R.id.tab_layout); 
    tabLayout.addTab(tabLayout.newTab().setText("1"); 
    tabLayout.addTab(tabLayout.newTab().setText("2")); 
    tabLayout.addTab(tabLayout.newTab().setText("3")); 
    tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); 

    viewPager = (ViewPager)mainView.findViewById(R.id.pager); 
    viewPager.setAdapter(pagerAdapter); 
    viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); 
    viewPager.requestFocus(); 

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

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

     } 

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

     } 
    }); 

    return mainView; 
} 

Xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:background="@android:color/white" 
    tools:context=".activities.companies.MyFragment"> 

    <android.support.design.widget.TabLayout 
     android:id="@+id/tab_layout" 
     app:tabMode="fixed" 
     android:background="@color/color_white" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_gravity="top" /> 

    <android.support.v4.view.ViewPager 
     xmlns:android="http://schemas.android.com/apk/res/android" 
     android:id="@+id/pager" 
     android:layout_below="@id/tab_layout" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 
</RelativeLayout> 

PagerAdapter:

public class MyPageAdapter extends FragmentStatePagerAdapter { 

    private ArrayList<Fragment> fragments = new ArrayList<>(2); 

    public MyPageAdapter(FragmentManager fragmentManager) { 
     super(fragmentManager); 

     fragments.clear(); 
     fragments.add(OneFragment.newInstance()); 
     fragments.add(TwoFragment.newInstance()); 
    } 

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

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

Update:

Хорошо, нашел его, у меня были некоторые остатки кода из MainActivity, где фрагмент будучи инстансы и там я добавлял тот же фрагмент, содержащий ViewPager.

Не совсем уверен, почему он так себя вел, поскольку оба ViewPagers были в разных местах и ​​имели разные имена, но все же это то, что вызывало странную ситуацию.

Кто-нибудь знает ответ на вопрос, почему именно это происходило, когда оба случая были технически разными и не должны влиять друг на друга?

Или я что-то упускаю?

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

ответ

1

После прочтения документации ViewPager. Ваш ViewPager не делает дважды страницы. onCreateView вызывается один раз для каждого экземпляра, возвращаемого getItem

1

Я подозреваю, что что-то происходит с тем, как вы инициализируете свои фрагменты в конструкторе адаптера и как вы используете FragmentStatePagerAdapter.

Попробуйте использовать FragmentPagerAdapter поэтому ваши фрагменты не уничтожаются в фоновом режиме, а также попробуйте установить ваш tabLayout с

tabLayout.setupWithViewpager(viewPager); 
0

Хорошо, нашел его, у меня был какой-то оставшийся код из MainActivity, где был установлен фрагмент, и там я добавлял тот же самый фрагмент, который содержит ViewPager.

Не совсем уверен Почему так себя вел, поскольку оба ViewPagers были в разных местах и ​​имели разные имена, но все же это то, что вызывало странную ситуацию.

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

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