1

mobile tutsによって作成された 2 ペインの例に従って、3 ペイン ビュー レイアウト (古典的な「マスター詳細」フロー) を使用してアプリケーションを開発しています。

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 ペイン ビュー (ワイド/ランドスケープ タブレット モード) で 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 を設定しました)。
2 番目 (中央) のパネルのフラグメントを置き換えるために同一のコードが使用されていますが、3 番目のパネルでは機能しない理由がわかりません。唯一の違いは、2 番目 (中央) のパネルのフラグメント置換コードが (2 番目のパネル) フラグメント コードではなく、(1 番目のパネル) アクティビティ コード内から実行されることです。

コンパイル エラーが発生することなく、上記の問題コードを次のコードに置き換えることができました。

                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 に答える