3

我正在尝试实现一个支持以下两个方向的活动:

+--------------------------+      +-------------+---------------------------+
|                          |      |             |                           |
|                          |      |             |                           |
|                          |      |             +--------           --------+
|   Header View            |      |             |                           |
|   (from fragment)        |      |             |                           |
|                          |      | Fragment    +--------           --------+
+--------------------------+      |             |                           |
|                          |      |             |          ListFragment     |
|                          |      |             |                           |
+---------         --------+      |             +--------           --------+
|         ListFragment     |      |             |                           |
|                          |      |             |                           |
+---------         --------+      +-------------+---------------------------+
|                          |
|                          |
+--------------------------+

如果我到处使用布局 XML 中定义的片段,这并不难。挑战来自我希望标题片段与 ListFragment 纵向滚动的事实。为此,我自己扩充了 XML 并将其添加为标题视图。这也有效,直到我旋转设备(从纵向到横向,反之亦然),此时,我得到以下异常:

Caused by: java.lang.IllegalArgumentException: Binary XML file line #3: Duplicate id 0x7f06002d, tag null, or parent id 0x0 with another fragment for com.example.MyHeaderFragment
    at android.support.v4.app.FragmentActivity.onCreateView(FragmentActivity.java:275)
    at android.view.LayoutInflater.createViewFromTag(LayoutInflater.java:558)

我认为这是因为我在一个方向手动加载片段并从另一个方向的布局自动加载。我想不出办法解决这个问题。

我想到的一种解决方案是在没有标题视图的 XML 中定义纵向布局(标题不会随 ListFragment 滚动),然后在创建视图后立即将视图从 ListFragment 上方移动到标题视图中,但这没有奏效。

这种设计注定要失败还是有人有聪明的解决方案?

4

2 回答 2

2

我通过id从片段中删除 s 解决了这个问题。现在FragmentManager不再将它们视为相同,因此不会引发异常。

于 2012-08-03T13:05:40.000 回答
0

您可以在更改方向之前从列表中删除标题视图。

adapter.removeHeader(view)在适当的地方(onStop或)使用onDestroy,我认为事情会如你所愿。

于 2012-08-03T13:06:28.863 回答