【发布时间】:2012-02-11 16:41:38
【问题描述】:
所以我正在开发一个想要在旧版 Android 设备上运行的项目,因此我使用了兼容性库。我正在使用类似于 NewsReader 的接口,只是不是将两个 Fragment 放在 Activity 中,而是嵌入在另一个 Fragment 中,该 Fragment 嵌入在 ViewPagger 中。
为简单起见,我们将使用这些术语...
Activity -> ViewPager -> ContainerFragment->Fragment1
->Fragment2
在 ContainerFragment 中,如果它是电话,我试图用片段 2 替换片段 1,所以我在 ContainerFragment 中尝试了以下代码...
import android.support.v4.app.FragmentTransaction;
...
public void onBarSelected(Integer index) {
selectedBarIndex = index;
if (isDualPane) {
// display it on the article fragment
mBarEditFragment.displayBar(index);
}
else {
// use separate activity
FragmentActivity activity = (FragmentActivity)getActivity();
FragmentTransaction ft = activity.getFragmentManager().beginTransaction();
ft.replace(R.id.bar_container, new BarEditFragment(),R.id.bar_edit);
}
}
但我得到以下编译错误
Type mismatch: cannot convert from android.app.FragmentTransaction
to android.support.v4.app.FragmentTransaction
我仔细检查过,该活动确实扩展了 FragmentActivity 的兼容性。
更新
试图更改为...
得到了....
MainActivity activity = (MainActivity)getActivity();
Object test = activity.getFragmentManager().beginTransaction();
FragmentTransaction ft = (FragmentTransaction)test;
ft.replace(R.id.bar_container, new BarEditFragment());
我得到了……
java.lang.ClassCastException: android.app.BackStackRecord cannot be cast to android.support.v4.app.FragmentTransaction
有什么想法吗?
回答:
我发现了我的问题问题是您不应该从 Activity 中获取 Fragment 管理器,而应该从 Fragment 中获取它。
这行得通....
public void onBarSelected(Integer index) {
selectedBarIndex = index;
if (isDualPane) {
// display it on the article fragment
//mBarEditFragment.displayBar(index);
}
else {
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.bar_container, new BarEditFragment());
ft.commit();
}
}
【问题讨论】:
-
您是否还检查过您正在将支持库导入到 ContainerFragment 中?另外,在 ft.replace() 之后,你真的应该调用 ft.commit()。
-
即“import android.support.v4.app.FragmentTransaction”而不是“import android.app.FragmentTransaction”。
-
是的,我是...import android.support.v4.app.FragmentTransaction;
-
Dianne Hackborn 说嵌入片段可能会导致问题:stackoverflow.com/questions/6221763/…。出于这个原因,我会避免这样做......
-
好的,这是一个地方。在没有看到所有代码的情况下,您获得的编译错误表明您正在某个地方导入标准 FragmentTransaction 而不是支持 FragmentTransaction。正如 Scott 指出的那样,您使用将 Fragment 嵌入另一个 Fragment 很可能是造成这种情况的原因。