2012-02-20 51 views
6

このアプリは、とりわけフラグメントを使用して私にとって学習の練習です。これは、いくつかの異なるフラグメントを管理する単一のアクティビティを持っています。最初はListFragment(A)で、アプリケーションがいつ起動し、カーソルからリスト項目を読み込むかを示します。リスト項目をクリックすると、その項目のListFragmentをDetailFragment(B)に置き換えるようアクティビティに通知されます。 (B)を見ながら、私は、画面を回転させた場合、私はこのように、(A)の上に(B)を参照してください。画面の回転後にAndroidのフラグメントが重なって表示される

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

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

RES /レイアウト/ 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(); 
} 
+0

あなたは「代替リソース」を調べましたか? http://developer.android.com/guide/topics/resources/providing-resources.html#AlternativeResources –

+0

さて、私は現時点で電話スクリーンに焦点を当てています。ListFragmentのレイアウトは、とにかくランドスケープでは違いはありません。実際には、ListFragmentのレイアウトxmlは存在しません。なぜなら、現在のListFragmentにはすべて組み込みのListViewがあるからです。 – Karakuri

答えて

4

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

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

これで、システムはすべての作成を処理します。断片。そしてあなたの活動は基本的にsetContentView()呼び出しに還元されます。

リストアイテムで、フラグメントマネージャーで詳細フラグメントが作成されているかどうかを確認します。作成されている場合は、詳細フラグメント内のpublic関数を呼び出してデータを設定します。

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

私は2つの良いチュートリアルを知っています。アンドロイドデベロッパーページのフラグメントページとvogella.deの両方が、詳細なサンプル/チュートリアルを提供します。

+0

FrameLayoutであることを指摘してくれてありがとうございます。しかし、私は別の活動を開始しないようにしています。これは何かの裏の仕事をしているからです。それは、あなたが私に1つか2つのアイデアを与えてくれたので、感謝します。 – Karakuri

2

これは私のために働く。

public void onCreate(Bundle savedInstanceState) { 

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

} 
3

LinerLayoutのFrameLayoutを変更すると、問題は解決されます。

これはFrameLayoutに関連する問題です。

+1

これは私のアーキテクチャを変更することなく私の仕事をしてくれました。 – BeccaP

5

Androidデベロッパーpageによると、アクティビティのonCreateメソッドでは、アクティビティにフラグメントを追加する前にsavedInstanceStateがnullであるかどうかを確認する必要があります。アクティビティのonCreateメソッドのコードスニペットは、this pageからです。

// 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; 
} 
+0

ありがとう、完璧に動作し、それと苦労して2時間後に私を救った – Mal

+0

シンプルとこれは働いた。 – iCrus

関連する問題