【发布时间】:2011-07-13 04:57:29
【问题描述】:
您可以将片段放入片段中以作为操作栏中的选项卡吗?
我有一个 Android (3.0/Honeycomb) 应用程序,其主要活动有一个带有 3 个选项卡的操作栏。在我的活动的 onCreate() 方法中添加选项卡,并使用 TabListener 添加/删除选项卡片段。该代码与http://developer.android.com/guide/topics/ui/actionbar.html#Tabs 的示例代码几乎相同。
TabListener 看起来像这样:
public class SwapOutTabListener implements ActionBar.TabListener {
public SwapOutTabListener(Fragment fragment) {
_fragment = fragment;
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft) {
ft.add(R.id.fragment_container, _fragment, null);
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft) {
ft.remove(_fragment);
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft) {
// do nothing
}
private Fragment _fragment;
}
我的两个选项卡是简单的片段,它们只包含一个 TextView,有点像这样(为了清楚起见,删除了大多数属性):
<LinearLayout>
<TextView android:text="Tab 1" />
</LinearLayout>
但是我的一个标签的片段更复杂,并且包含两个嵌入的片段,有点像这样:
<LinearLayout>
<fragment
android:name="...Fragment_1"
android:id="@+id/frag1"
/>
<fragment
android:name="...Fragment_2"
android:id="@+id/frag2"
/>
</LinearLayout>
当用户为此片段选择选项卡时,所有三个片段(选项卡片段,加上两个嵌入片段)的所有启动生命周期方法(onStart()、onResume())都会被调用。
但是当用户随后选择另一个选项卡时,只有选项卡片段获得任何生命周期结束方法(onPause()、onStop() 等)。两个嵌入的片段永远不会收到任何这些调用,也永远不会关闭。
这会在重新选择选项卡时导致问题,因为运行时在加载选项卡片段时会抱怨重复的片段 ID:
Binary XML file line #7: Duplicate id 0x7f05000a, tag null, or parent id 0x7f050009 with another fragment for ...Fragment_1
当标签片段被移除时,我是否有责任移除这些嵌入片段?如果是这样,我应该在什么时候这样做?
【问题讨论】:
-
您能否发布执行选项卡切换的 TabListener 代码?上面重复的
android:id="@+id/frag2"行也是故意的还是只是此处发布的问题中的转录错误? -
@adamp,是的,重复的 id 是一个转录错误......我编辑了这个问题来纠正这个问题。我还在问题中添加了我的 TabListener 代码。
标签: android android-fragments android-actionbar