1

我正在开发一个使用 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 消息:

“找不到来源”

任何如何纠正此问题的想法将不胜感激。

4

1 回答 1

2

您必须使用接口。每当您需要在片段之间进行通信时,您必须在每个片段中声明一个接口,并且该接口必须由持有它的活动实现。然后在片段中的某个事件上,您调用该活动实现的方法。然后在该方法中您进行必要的操作(在您的情况下更改/替换片段),这必须反映在其他片段中。

检查我的这个答案。它与您必须遵循的相似。

https://stackoverflow.com/a/15296370/1567588

于 2013-04-04T04:56:41.430 回答