我正在开发一个使用 3 窗格视图布局(经典的“主-细节”流程)的应用程序,遵循由mobile tuts创建的 2 窗格示例。
3 窗格布局如下所示:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="0dp"
android:layout_marginRight="0dp"
android:background="?android:attr/detailsElementBackground"
android:divider="?android:attr/dividerHorizontal"
android:orientation="horizontal"
android:showDividers="middle"
tools:context=".SListA" >
<!--
This layout is a three-pane layout for the
master/detail flow.
-->
<fragment
android:id="@+id/s_list"
android:name="com.xxxxx.xxxxxx.SListF"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/s_events"
android:paddingLeft="4dp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1" />
<FrameLayout
android:id="@+id/s_details"
android:paddingLeft="4dp"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="0.5" />
我在尝试替换上述 3 窗格视图中的第三个片段面板时遇到了问题(在宽/横向平板电脑模式下)。错误在下面的最后一行代码中,要从中间面板片段代码中执行:
@Override
public void setEventKey(String event_key) {
if (SListA.m3Pane) {
// In three-pane mode, show the details view in this activity by
// adding or replacing the details fragment using a
// fragment transaction.
Bundle arguments = new Bundle();
arguments.putString(SDetailsF.ARG_EVENTKEY, event_key);
SDetailsF fragment = new SDetailsF();
fragment.setArguments(arguments);
getFragmentManager().beginTransaction()
.replace(R.id.s_details, fragment).commit();
}
上面的最后一行代码显示了一个编译错误:
无法从类型 Fragment 对非静态方法 getFragmentManager() 进行静态引用
(注意,我设置了 minSdkVersion=11)。
使用相同的代码替换第二个(中间)面板的片段,我不明白为什么它不适用于第三个面板。唯一的区别是,第二个(中间)面板的替换片段代码是从(第一个面板)活动代码中运行的,而不是从(第二个面板)片段代码中运行的。
我能够用以下代码替换上述问题代码,而不会出现编译错误:
fragment.getFragmentManager().beginTransaction()
.replace(R.id.s_details, fragment).commit();
但是,此代码在运行期间执行时会崩溃,并带有 InvocationTargetException 消息:
“找不到来源”
任何如何纠正此问题的想法将不胜感激。