画面回転後にオーバーラップするAndroidフラグメント
-
28-10-2019 - |
質問
このアプリは、特にフラグメントを使用している私にとっての学習演習です。いくつかの異なるフラグメントを管理する単一のアクティビティがあります。 1つ目はリストフラグ(a)です。これは、アプリがカーソルのリストを使用してロードするときを示しています。リスト項目をクリックすると、アクティビティが通知され、リストフラグメントをそのアイテムの詳細なフラグメント(b)に置き換えます。 (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();
}
解決
フレームレイアウトをコンテナとして使用するためです。他のレイアウトでは重複しません。
そして、ベストプラクティスを達成したいのは、リストフラグのみが使用されるレイアウト/フォルダーにXMLファイルを作成することです。レイアウトランド/両方のフラグメントを使用して配置したXMLファイルを配置します。
次に、システムはすべての作成を処理します。フラグメント。そして、あなたのアクティビティは基本的にsetContentView()呼び出しに減少します。
リスト項目でクリックして、詳細フラグメントが作成されているかどうかをフラグメントマネージャーに確認します。それが作成されている場合、データを設定するために詳細フラグメント内のパブリック関数を呼び出します。
作成されていない場合は、新しいアクティビティで意図を作成します。
2つの優れたチュートリアル:Android開発者ページのフラグメントページとvogella.deの両方で、詳細な例/チュートリアルが表示されます。
他のヒント
Android Devに従って ページ, 、アクティビティのonCreateメソッドでは、アクティビティにフラグメントを追加する前に、SavedInstancestateがnullかどうかを確認する必要があります。 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;
}
LinerLayoutのFrameLayoutを変更すると、問題が解決します。
これは、フレームレイアウト関連の問題です。
これは私のために働きます。
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
....
fragment = getFragmentManager().findFragmentByTag(TAG);
if(fragment == null) fragment = new Fragment();
....
}