Intereting Posts
Как получить список доступных сетевых провайдеров? Android реагировать родной не мог получить пакетированный мост Изменение цвета фона активированного списка элементов на сотах Android. Как возможно, что служба продолжает работать после закрытия Activity? Невозможно выполнить dex: несколько файлов dex определяют Lcom / google / android / gms / analytics / internal / Command Amazon SNS: обрабатывает ли он канонические идентификаторы Google Cloud Messaging? Как создать пользовательские свойства в xml для Android? Android – как найти несколько просмотров с общим атрибутом Расширенное представление, требуемое для расширения строки по очереди Услуга Intent никогда не вызывается Получение "вызвано: java.lang.VerifyError:" Пользовательская задача Android Gradle для каждого варианта Переход с флип-карты между двумя действиями Android Как предотвратить инъекцию XML, такую ​​как XML Bomb и XXE-атака Получение текущего местоположения устройства с помощью {X} api

Android ViewPager Загрузка неправильных фрагментов

Поэтому я пытаюсь получить панель вкладок и макет под моей основной навигационной панелью, работая над моей основной деятельностью.

Кажется, я не могу получить ViewPager / TabLayout (неуверенный, который является причиной проблемы, новичок в этом) для загрузки правильного фрагмента. Я прочитал тонну документации и проверил более 1 учебника, чтобы узнать, правильно ли я делаю это, и кажется, что я делаю то же самое, что и они …

OnTabSelectedListener для моего TabLayout видит, что вкладка изменяется правильно, а в OnTabSelected Im вызывает viewPager.setCurrentItem(tab.getPosition()) чтобы попытаться установить элемент viewpagers, но он все еще не работает. При первой загрузке он загружает первую и вторую вкладки (я могу видеть через отправленный запрос API из методов fragments onCreate), и когда я нажимаю на другие вкладки, он последовательно загружает неправильный фрагмент, иногда даже не загружая его вообще !

Не уверен, что это связано, но я получаю это предупреждение при переключении вкладок:

03-03 16:24:22.940 16967-16967/com.sampleapp.app W/FragmentManager: moveToState: Fragment state for BlankFragment3{efddbec #2 id=0x7f0c007b android:switcher:2131492987:2} not updated inline; expected state 3 found 2

Я использую средства сборки версии 23.0.2 и следующие зависимости:

 compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' 

Это мой код макета для моей основной панели навигации:

 <?xml version="1.0" encoding="utf-8"?> 

 <android.support.design.widget.AppBarLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:theme="@style/AppTheme.AppBarOverlay"> <android.support.v7.widget.Toolbar android:id="@+id/toolbar1" android:layout_width="match_parent" android:layout_height="?attr/actionBarSize" android:background="?attr/colorPrimary" app:popupTheme="@style/AppTheme.PopupOverlay" /> <android.support.v7.widget.Toolbar android:id="@+id/toolbar2" android:layout_width="match_parent" android:layout_height="10dp" android:background="?attr/colorPrimary" app:layout_scrollFlags="scroll|enterAlways" app:popupTheme="@style/ThemeOverlay.AppCompat.Light" /> <android.support.design.widget.TabLayout android:id="@+id/tab_layout" 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.FloatingActionButton android:id="@+id/fab" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="bottom|end" android:layout_margin="@dimen/fab_margin" android:src="@android:drawable/ic_input_add" /> </android.support.design.widget.CoordinatorLayout> 

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

 public class TabsAdapter extends FragmentPagerAdapter{ private final List<Fragment> mFragmentList = new ArrayList<>(); private final List<String> mFragmentTitleList = new ArrayList<>(); public TabsAdapter(FragmentManager fm) { super(fm); } public void addFrag(Fragment fragment, String title){ mFragmentList.add(fragment); mFragmentTitleList.add(title); } @Override public Fragment getItem(int position) { return mFragmentList.get(position); } @Override public int getCount() { return mFragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position); } } 

И вот как я установил свой просмотрщик и вкладку

MainActivity's onCreate:

  ViewPager = (ViewPager) findViewById(R.id.viewpager); setupViewPager(mViewPager); // Method defined below TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.setupWithViewPager(mViewPager); tabLayout.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() { @Override public void onTabSelected(TabLayout.Tab tab) { mViewPager.setCurrentItem(tab.getPosition()); Log.w("Tab Selection", String.valueOf(tab.getPosition())); } @Override public void onTabUnselected(TabLayout.Tab tab) { } @Override public void onTabReselected(TabLayout.Tab tab) { } }); 

И, наконец, мой метод setupViewPager:

 private void setupViewPager(ViewPager viewPager) { TabsAdapter adapter = new TabsAdapter(getSupportFragmentManager()); adapter.addFrag(new BlankFragment1(), "One"); adapter.addFrag(new BlankFragment2(), "Two"); adapter.addFrag(new BlankFragment3(), "Three"); viewPager.setAdapter(adapter); } 

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

Спасибо заранее!

Попробуйте использовать этот код: D

Адаптер ViewPager

 public class PageAdapter extends FragmentStatePagerAdapter { int mNumOfTabs; public PageAdapter(FragmentManager fm,int numTabs) { super(fm); this.mNumOfTabs = numTabs; } @Override public Fragment getItem(int position) { switch (position) { case 0: RemindsTab remindsTab = new RemindsTab(); return remindsTab; case 1: TasksTab tasksTab = new TasksTab(); return tasksTab; case 2: QuicklyNotesTab quicklyNotesTab = new QuicklyNotesTab(); return quicklyNotesTab; default: return null; } } @Override public int getCount() { return mNumOfTabs; } } 

И мой код в MainActivity для этих вкладок:

  final TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout); tabLayout.addTab(tabLayout.newTab().setText("Recordatorios")); tabLayout.addTab(tabLayout.newTab().setText("Tareas")); tabLayout.addTab(tabLayout.newTab().setText("Notas Rapidas")); tabLayout.setTabGravity(TabLayout.GRAVITY_FILL); final ViewPager viewPager = (ViewPager) findViewById(R.id.pager); final PagerAdapter adapter = new PageAdapter(getSupportFragmentManager(),tabLayout.getTabCount()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(tabLayout)); tabLayout.setOnTabSelectedListener(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) { } }); 

Надеюсь, что вы сможете решить свою проблему 🙂

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

Добавить класс

 class FragmentHolder{ Fragment fragment; String title; public FragmentHolder(Fragment fragmentm String title){ this.fragment = fragment; this.title = title; } } 

И в адаптере

 public class TabsAdapter extends FragmentPagerAdapter{ private final List<FragmentHolder> mFragmentList = new ArrayList<>(); public TabsAdapter(FragmentManager fm) { super(fm); } public void addFrag(FragmentHolder fragmentHolder){ mFragmentList.add(fragmentHolder); } @Override public Fragment getItem(int position) { return mFragmentList.get(position).fragment; } @Override public int getCount() { return mFragmentList.size(); } @Override public CharSequence getPageTitle(int position) { return mFragmentTitleList.get(position).title; } } 

Прежде всего, вы должны знать, как работает FragmentPageAdaper. FragmentPagerAdapter создает два (2) фрагмента при запуске, Первый индекс (0) Фрагмент и Второй следующий индекс (1) Фрагмент. Поэтому не пытайтесь бороться с кодом, просто измените свой логин в соответствии с работой FragmentPageAdapter по умолчанию.

1) добавьте эту строку в действие

 viewPager.setOffscreenPageLimit("your number of fragment"); 

2) добавьте это в свой фрагмент, чтобы вы могли контролировать действие фрагмента, когда пользователь переключался между страницами

  // pause video and other list when user switch fragment pager public void setUserVisibleHint(boolean isVisibleToUser) { super.setUserVisibleHint(isVisibleToUser); if (this.isVisible()) { if (!isVisibleToUser) // If we are becoming invisible, then... { mPlayer.pause(); final SharedPreferences.Editor editor= pref.edit(); editor.putBoolean("PlayerPause", true); editor.putInt("videotime",mPlayer.getCurrentTimeMillis()); editor.commit(); Log.e("Video "," serUserVisibleHint not visible to User");//pause or stop video } if (isVisibleToUser) // If we are becoming visible, then... { Log.e("Video "," serUserVisibleHint Visible to User"); //play your video } } } 

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