早安全,
我的Activity的ActionBar在放置一段时间后保持正常功能时遇到问题。基本上我设置了不同的ActionBar视图,这取决于我所在的ViewPager中的哪个页面。 3的中间页面实现ActionBar.NAVIGATION_MODE_LIST,其中包含用于过滤该页面上ListView内容的列表。在另外两页上,此列表未显示。我的处理代码:
public class SectionsPagerAdapter extends MyPagerAdapter {
public SectionsPagerAdapter(FragmentManager fm) {
super(fm);
}
@Override
public Fragment getItem(int i) {
Fragment fragment;
if(i==0){
ActionBar bar = MyApp.this.getActionBar();
bar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
fragment = page1;
}else if(i==1){
fragment = page2;
}else{
fragment = page3;
}
return fragment;
}
@Override
public int getCount() {
return 3;
}
@Override
public void onPageSelected(int position) {
if(position== 1 && menuSearch != null){
menuSearch.setVisible(true);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_LIST);
}else{
if(menuSearch != null){
menuSearch.setVisible(false);
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_STANDARD);
}
}
currentPage = position;
}
public int getCurrentPage() {
return currentPage;
}
我目前能够通过启动新活动来强制执行测试失败,然后我可以强行关闭,当我回到此主要活动时,每个页面上都会显示ActionBars下拉菜单。该菜单也失去了与它在第二页中执行的过滤属性的连接。
更新1:
我现在相信我的问题在于我的ViewPager,ActionBar和它们控制的碎片之间的脱节。我将以下代码添加到Activity的onNavigationItemSelected部分:
@Override
public boolean onNavigationItemSelected(int itemPosition, long itemId) {
Log.i(TAG,"Fragment ID:" + String.valueOf(fragment.getId()));
if(fragment.isAdded()){
Log.i(TAG,"fragment.isAdded");
}
当我第一次运行应用程序时,这些日志会返回以下内容:
片段ID:2131492869 fragment.isAdded
然而,在我强制崩溃或离开应用程序并稍后返回后,日志返回
片段ID:0
此时fragment.isAdded为false,但我不确定原因。
非常感谢任何帮助。
谢谢, 约什
答案 0 :(得分:0)
任何人都可以告诉我为什么会这样吗?我应该在onPause中以某种方式保存动作栏状态,然后在onResume中恢复吗?
是的,这是因为你没有保存最后一个索引,
基本上你需要做的是
onResume
中的
设置viewPager当前索引,如下所示:viewPager.setCurrentItem(lastFragmentIndex);
我认为您需要在onSaveInstanceState
中保存您的片段,并将其恢复为onRestoreInstanceState
,如下所示:
protected void onSaveInstanceState(Bundle outState) {
FragmentManager fm = getSupportFragmentManager();
fm.putFragment(outState, 1, fragment1);
fm.putFragment(outState, 2, fragment2);
}
并恢复
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
FragmentManager fm = getSupportFragmentManager();
fragment1 = (Fragment) fm.getFragment(savedInstanceState, 1);
}