11

このアプリは、特にフラグメントを使用した学習演習です。いくつかの異なるフラグメントを管理する単一のアクティビティがあります。1つ目はListFragment(A)で、アプリがいつ起動し、カーソルからリストアイテムをロードするかを示します。リストアイテムをクリックすると、そのアイテムのListFragmentをDetailFragment(B)に置き換えるアクティビティが通知されます。(B)を見ているときに画面を回転させると、次のように(A)の上に(B)が表示されます。

http://postimage.org/image/uhy016ds7/

私の最善の推測は、Androidが構成変更時にアクティビティを破棄して再作成することと関係があるということです。私はこの問題の最もクリーンな解決策は何であるか疑問に思っています。いくつかのコードスニペットが続きます。他に投稿する必要があるものがあるかどうか教えてください。

res / layout / home.xml

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent" >

    <fragment
        android:id="@+id/fragment_place_list"
        android:name="com.simbiosys.apps.foodfast.ui.PlaceListFragment"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </fragment>
</FrameLayout>

MyActivity.onCreate

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.home);

    placeListFragment = (PlaceListFragment) getSupportFragmentManager().findFragmentById(
            R.id.fragment_place_list);

}

MyActivity.showDetailPane

public void showDetailPane(String id, String reference) {
    placeDetailFragment = PlaceDetailFragment.newInstance(id, reference);
    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction ft = fragmentManager.beginTransaction();
    ft.addToBackStack(null);
    ft.hide(placeListFragment);
    ft.replace(R.id.fragment_container, placeDetailFragment);
    ft.show(placeDetailFragment);
    ft.commit();
}
4

4 に答える 4

12

Android dev pageに従って、Activity の onCreate メソッドで、フラグメントをアクティビティに追加する前に、savedInstanceState が null かどうかを確認する必要があります。このページの Activity の onCreate メソッドのコード スニペットは、それを示しています。

// However, if we're being restored from a previous state,
// then we don't need to do anything and should return or else
// we could end up with overlapping fragments.
if (savedInstanceState != null) {
     return;
}
于 2016-01-31T17:43:08.680 に答える
6

フレーム レイアウトをコンテナーとして使用するためです。他のレイアウトでは重複しません。

そして、ベストプラクティスを達成したいのは、リストフラグメントのみが使用されるレイアウト/フォルダーにXMLファイルを作成することです。あなたの layout-land/ には、使用および配置されたフラグメントの両方を含む XML ファイルを配置します。

次に、システムがすべての作成を処理します。フラグメント。そして、あなたの活動は基本的に setContentView() 呼び出しになります。

リスト項目をクリックして、詳細フラグメントが作成されているかどうかをフラグメントマネージャーで確認します。作成された場合は、詳細フラグメント内でパブリック関数を呼び出してデータを設定します。

作成されていない場合は、新しいアクティビティでインテントを作成します。

2 つの優れたチュートリアルを知っています。Android 開発者ページのフラグメント ページと vogella.de の両方で、詳細な例/チュートリアルが提供されます。

于 2012-02-20T23:50:55.633 に答える
5

FrameLayout を LinerLayout に変更すると、問題は解決します。

これは FrameLayout 関連の問題です。

于 2013-12-18T03:50:59.153 に答える
2

これは私にとってはうまくいきます。

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    ....
    fragment = getFragmentManager().findFragmentByTag(TAG);
    if(fragment == null) fragment = new Fragment();
    ....

}
于 2012-07-12T10:03:46.993 に答える