2013-03-14 55 views
1

我的应用程序的目标是API 8及更高版本,并使用ActionbarSherlock。 Activity延伸SherlockFragmentActivity。我对viewpager片段适配器如下:getFragmentManager()返回null

public class MyFragmentAdapter extends FragmentPagerAdapter { 

    public Fragment getItem(int position) { 
     ... 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     super.destroyItem(container, position, object); 

     FragmentManager manager = ((ListFragment) object).getSherlockActivity().getSupportFragmentManager(); 
     FragmentTransaction trans = manager.beginTransaction(); 
     trans.remove((Fragment) object); 
     trans.commit(); 
    } 
} 

destroyItem用于去除FragmentPagerAdapter的页面。这是第一次正常工作,也许前两次页面被删除。但在持续页面删除的某个时间点,manager返回null,应用程序在manager.beginTransaction()行上崩溃。

我似乎无法弄清楚这是为什么...

+1

这可能是由于super.destroyItem(....);在你的经理打电话之前被呼叫。 ((ListFragment)(object))可能有一些属性在调用之前被销毁。基本上是竞争条件,这将解释间歇性。尝试将代码后的呼叫移至super.destroy ...。 – 2013-03-14 17:09:54

+0

同样在未来,请在崩溃问题时添加堆栈跟踪。 – Warpzit 2013-03-14 17:12:50

回答

1

我想通了这个问题。原来ListFragment传递到destroyItem有其FragmentManager == null,因为我没有正确删除清单中的无效WeakReference项目。

0

最后,几天前我可以找到我的错误。

解决方法很简单:

只需创建一个新的捆绑变量作为全局变量

Bundle datosGuardados; 

存储savedInstanceState

的数据
datosGuardados = savedInstanceState; 

最后只是检查它是否null之前使用任何getFragmentManager

if (datosGuardados != null) infoF = (InformacionFragment) getFragmentManager().findFragmentById(R.id.posicionamiento_layout);