3

我对android开发很新颖,我从一个简单的项目开始学习如何处理大部分的基本UI。FragmentPageAdapter的怪癖和崩溃

我已经使用了ActionBarSherlock和ViewPageIndicator,并且总体而言,我创建的简单应用程序正在工作,但我仍然有一些奇怪的问题。让我来描述一下:

  • 当我点击FragmentPageAdapter将片段移动到其位置的按钮时,我分配给事务的转换效果不会发生。只有当我返回时才会发生(交易被添加回堆栈)并再次按下按钮。
  • 如果我点击按钮后返回,然后再次单击它,会显示片段 - 但会表现出奇怪的现象,并且会执行各种奇怪的操作,例如,FragmentPageAdapter认为它有5个页面,而实际上它是3个额外的页面只是空白,他们的标题也是)
  • 如果我点击按钮,然后更改设备的方向,应用程序崩溃 - 尝试调试它,但我得到一些代码在android框架内。

我想我遇到了所有这些问题,因为我在代码中的某处出错了。请帮我理解我的问题,如果可以的话,请告诉我一些好的做法或者我无法阅读和理解我做错了什么的地方,以及如何以正确的方式做到这一点。

我上传的代码中的问题在这里:https://code.google.com/p/mich-android-testapp/source/browse/trunk/TestApp/

我感谢所有帮助,从你们!

回答

3

您的代码有几个问题,它们很可能是您列出的问题的根源。

首先,您在正常活动(MainActivity)中声明一个静态片段(直接在xml布局中声明的片段),稍后您将在OnClickListener的基类中替换它。这不会很好,因为您不应该使用静态碎片进行交易。相反,你应该放置一个容器布局,在其中以编程方式添加片段(如果你要对它们进行操作)(作为附注,你应该尝试使用替代事务的通用标识符,否则如果你忘记使用相同的确切ID在BaseActivity子类中你会遇到麻烦)。

第二个主要问题是,您存储ViewPager中的片段,并假定这些片段始终是您要使用的片段。当ViewPager将自动重新创建片段时,配置更改后这将失败。

如果要使用嵌套片段,则必须将getChildFragmentManager()BasePagerFragment传递到FragmentPagerAdapter

另外,不要用普通的方法将数据传递给片段,因为这些数据在配置变更时无法生存(我指的是setPage()方法)。改为使用Bundle

解决这个问题后,看看是否仍然出现错误。

+0

非常感谢你!通过使用LinearLayout作为容器而不是片段来解决崩溃问题,否则通过使用bundle,getChildFragmentManager()来解决,而不是保存充气的子片段。 – 2013-04-15 15:55:13