我正在尝试使用FragmentStatePagerAdapter和ViewPager制作一个包含4个选项卡的应用程序。
当我第一次运行应用程序时,如果我按顺序(0到3)选择选项卡,一切正常,然后如果我尝试执行返回(3到0)的方式,选项卡1将显示一个空白屏幕,如果,在那之后,我选择选项卡2,然后也是空的,如果我转到选项卡0,然后再次按顺序执行选项卡2返回生活,有时选项卡1返回生活,但我没有找到任何顺序。。。
我知道这是一团糟...问题是选项卡1使用失败,选项卡2失败了几次,选项卡0和3总是工作正常。如果我交换碎片的位置一切都是一样的,有些我认为与碎片代码不相关...
在logcat中没有显示错误,调试片段表明一切都按照它应该的方式进行。。。
几天来,我一直在试图修复它,但运气不好(很明显…),我已经尝试重写getItemPosition()以返回POSITION\u NONE,我已经尝试创建我自己的FragmentStatePagerAdapter,如下所示http://speakman.net.nz/blog/2014/02/20/a-bug-in-and-a-fix-for-the-way-fragmentstatepageradapter-handles-fragment-restoration/但没什么。。。还有一些对我不起作用的事情。
一些代码:主类
public class Main extends FragmentActivity implements ActionBar.TabListener {
private MyPageAdapter mPagerAdapter;
private ViewPager mPager;
@Override
protected void onCreate(Bundle si) {
super.onCreate(si);
setContentView(R.layout.activity_main);
init();
}
private void init() {
final ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
if (mPagerAdapter == null) {
mPagerAdapter = new PaginaAdapter(getSupportFragmentManager());
mPager = (ViewPager) findViewById(R.id.pager);
mPager.setAdapter(mPagerAdapter);
mPager.requestTransparentRegion(mPager);
mPager.setOnPageChangeListener(new viewPager.SimpleOnPageChangeListener() {
@Override
public void onPageSelected(int position) {
actionBar.setSelectedNavigationItem(position);
}
});
// Tab creation
for (int i = 0; i < mPagerAdapter.getCount(); i++) {
View tabView = getLayoutInflater().inflate(R.layout.tab, null);
((ImageView) tabView.findViewById(R.id.tabIcon))
.setImageDrawable(getResources().getDrawable(mPagerAdapter.getIcon(i)));
actionBar.addTab(actionBar.newTab().setCustomView(tabView).setTabListener(this));
}
}
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
mPager.setCurrentItem(tab.getPosition());
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
}
适配器
public class MyPageAdapter extends FragmentStatePagerAdapter {
public MyPageAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int position) {
Fragment fragment = null;
switch (position) {
case 0:
fragment = new InitFragment();
break;
case 1:
fragment = new MusicFragment();
break;
case 2:
fragment = new VideoFragment();
break;
case 3:
fragment = new PicFragment();
break;
}
return fragment;
}
@Override
public int getCount() {
return 4;
}
....
}
谢谢
更新:我的片段在单独的类中,它们不是静态的,这很重要吗?我刚刚意识到的另一件事是,在我触摸标签后,它似乎正在破坏碎片,因为如果我慢慢滑动,我可以看到碎片,但突然一切都消失了
尝试使用FragmentPagerAdapter
MyPageAdapter .java
public class MyPageAdapter extends FragmentPagerAdapter {
public MyPageAdapter (FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int index) {
switch (position) {
case 0:
fragment = new InitFragment();
break;
case 1:
fragment = new MusicFragment();
break;
case 2:
fragment = new VideoFragment();
break;
case 3:
fragment = new PicFragment();
break;
}
return null;
}
@Override
public int getCount() {
// get item count - equal to number of tabs
return 4;
}
}
我建议您使用FragmentPagerAdapter
而不是FragmentStatePagerAdapter
。似乎您只希望每个选项卡有3个选项卡
和一个片段
,这听起来不太消耗内存(只要不是充满了位图
等)。当使用FragmentStatePagerAdapter
时,您负责在重新加载时恢复每个Frament
的状态,使用FragmentPagerAdapter
系统将保留View
层次结构,这就是您想要的。
问题内容: 我只是很好奇,因为我已经在FragmentActivity中设置了Fragment选项卡,如何从FragmentActivity或Fragment本身重新加载片段,以清除并重新加载该选项卡。我本质上需要重新选择选项卡以替换片段时发生的相同事情。有一种简单的方法可以执行此操作并重新加载片段吗? 问题答案: 创建一个方法,该方法开始FragmentTransaction,分离片段,然后提交
我在我的应用程序中使用导航栏,每次我选择一个项目时,它都会加载一个片段。 我能够使用相同的文本字段和按钮保存片段的状态,但有一个片段可以加载地图、添加标记、集群并执行。 每次我转到另一个菜单项并返回时,它都会重新加载所有内容,例如AsyncTask、Cluster、Markers。我如何停止此片段以不再重新创建地图并在返回时保存状态: Udate 1:我更新了代码,但问题仍然存在 主要活动: 主片
我有一个由片段填充的ViewPager。特别是,我有一个片段,它显示了Addresses对象的列表和一个允许创建新地址的列表。添加新地址的过程如下: 因此,当添加新地址时,我回到AddressListFragment,它是ViewPager中的活动地址。我需要更新该片段,以便更新列表与新添加的地址时,我回来它!我需要在那个片段上重写一个特定的方法吗? 提前道谢!
我正在使用AngularJS和Ionic框架构建一个应用程序。我的应用程序需要有一个注销按钮。当用户按下注销按钮时,我想重新加载页面,以便重新引导应用程序,并清除所有缓存数据。基于这个StackOverflow问题,我应该能够只做<<代码>$窗口。地方重新加载(true)。如果我只是通过ionic serve在浏览器中运行该应用程序,效果很好。然而,当我在实际设备上运行它时,屏幕会变为空白,再也不
我在主活动中有以下代码 可扩展置标语言 有时当我打开我的应用程序时,只会显示白屏。我已经使用AsyncTask将数据库从资产文件夹复制到设备,共享首选项将设置字体类型和大小。谁能帮我解决这个问题。谢谢你。 在提出问题之前,我已经阅读了以下问题 Android应用程序启动时的白色背景 android闪屏前几秒钟的白色背景 闪屏活动背景色
我在过去的两个小时里一直在试图解决这个问题。试过很多东西。 该片段似乎正在向我的适配器传递空上下文。我尝试在onCreate和onCreateView和onActivityCreated中初始化上下文变量。同样的结果。