Android ViewPager正在加载不正确的片段
因此,我试图在我的主导航栏下获得一个选项卡栏和布局,以处理我的主要活动 我似乎无法让ViewPager/TabLayout(不确定是什么原因导致了问题,这是新的)加载正确的片段。我已经阅读了大量的文档,检查了不止一个教程,看看我是否做得正确,看起来我做的和他们一样 myAndroid ViewPager正在加载不正确的片段,android,android-layout,android-fragments,android-viewpager,android-tablayout,Android,Android Layout,Android Fragments,Android Viewpager,Android Tablayout,因此,我试图在我的主导航栏下获得一个选项卡栏和布局,以处理我的主要活动 我似乎无法让ViewPager/TabLayout(不确定是什么原因导致了问题,这是新的)加载正确的片段。我已经阅读了大量的文档,检查了不止一个教程,看看我是否做得正确,看起来我做的和他们一样 myTableLayout的OnAbsSelectedListener看到选项卡正确更改,在OnAbsSelected中,我调用viewPager.setCurrentItem(tab.getPosition())尝试设置我的view
TableLayout
的OnAbsSelectedListener
看到选项卡正确更改,在OnAbsSelected
中,我调用viewPager.setCurrentItem(tab.getPosition())
尝试设置我的viewpagers项目,但它仍然不起作用。在第一次加载时,它加载第一个和第二个选项卡(我可以通过fragments onCreate方法发送的API请求看到),当我单击其他选项卡时,它始终加载错误的片段,有时甚至根本不加载一个
不确定这是否相关,但我在切换选项卡时收到此警告:
03-03 16:24:22.940 16967-16967/com.sampleapp.app W/FragmentManager:moveToState:BlankFragment3的片段状态{efddbec#2 id=0x7f0c007b android:switcher:2131492987:2}未在线更新;预期状态3已找到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"?>
最后是我的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);
}
如果有人认为这有什么问题,请告诉我,我不能让这些该死的标签加载正确的片段
提前谢谢
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;
}
}
公共类TabsAdapter扩展了FragmentPagerAdapter{
私有最终列表MFFragmentList=new ArrayList();
公共选项卡适配器(碎片管理器fm){
超级(fm);
}
公共无效添加碎片(碎片持有人碎片持有人){
MFFragmentList.add(碎片持有者);
}
@凌驾
公共片段getItem(int位置){
返回mffragmentlist.get(position.fragment);
}
@凌驾
public int getCount(){
返回MFFragmentList.size();
}
@凌驾
公共字符序列getPageTitle(int位置){
返回MFFragmentTitleList.get(position.title);
}
}
尝试使用此代码匹配:D
可视寻呼机适配器
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) {
}
});
希望您能解决您的问题:)首先,您必须了解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,我所做的只是将选项卡Adapter扩展的类从FragmentPagerAdapter更改为FragmentStatePagerAdapter,从而允许检测viewPager中的不同状态更改。我这样做了,效果很好。您调试了ontabonselected和onTabReselected的回调吗?它们工作正常吗?@IgorB unselected正在工作,但似乎在本教程中没有调用reselected。他们使用FragmentStatePagerAdapter,你试过了吗?我编辑了我的评论:)参考这个答案
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) {
}
});
viewPager.setOffscreenPageLimit("your number of fragment");
// 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
}
}
}