9

レイアウトの断片化に問題があります。以前に回答されたことがあり、愚かすぎて見つけられなかった場合は、心からお詫び申し上げます。私は何時間も検索して何も得られませんでした(まあ、私はたくさん得ましたが、何も私の問題を解決しませんでした)。

これが私の設定です。フラグメントのコンテナとして2つのFrameLayoutを使用する2つのペインのレイアウトがあります。activity_listing.xml:

<FrameLayout android:id="@+id/listing" />
<FrameLayout android:id="@+id/details" />

アプリを開くと(フラグメントのアクティビティでonCreate)、FragmentTransactionを使用してプログラムでListingというフラグメントがFrameLayoutの「リスト」に追加されます。

public class ListingActivity extends FragmentActivity
        implements ListingFragment.Callbacks {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_listing);

    // Displaying the first listing here ...
    Fragment fragment = new ListingFragment();
    FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
    ft.add(R.id.listing, fragment);
    ft.addToBackStack(null);
    ft.commit();
    ...
}

このListingFragmentは実行時に数回置き換えられるため、XMLで定義するのではなく、作成する必要があります。私は後者を試してみました

<fragment android:name="com.example.app.ListingFragment" />

ただし、後でプログラムで置き換えたり削除したりすることはありません。add()しかできないので、古いものが新しいものを通して見えます。しかし、それはここでは問題ではありません-私のやり方の説明にすぎません。

これまでのところ、これはすべて正常に機能し、リストが作成および表示されるなど、問題はありません。だが:

起動時にListingFragmentが表示され、戻るキーを押すと、最後の位置で、ホーム画面に戻る代わりに、FrameLayoutの「リスト」が空になります。私のListingActivityのonCreateが空のフレームを表示し、それにListingFragmentを追加するためである必要があると考えました。したがって、バックスタックにも空のフレームがあります。右?

私はこれによってListingActivityに状況を解決しようとしました:

@Override
public void onBackPressed() {
    super.onBackPressed();
    if(getSupportFragmentManager().getBackStackEntryCount() == 0) {
        this.finish();
    }
}

しかし、どういうわけかそれは正しく見えないか、感じられません...それは悪い回避策のように見えます。

それで、空のFrameLayoutを持つビューが膨らむ前にフラグメントを挿入して、「戻る」ための空の状態がないようにする方法はありますか?または、バックスタックにない場合でも、バックスタックから「空の」状態を削除することは可能ですか?「戻る」を押した後に空のフレームを回避する方法に関する他のアイデアはありますか?

よろしくお願いします!

4

1 に答える 1

11

ft.addToBackStack(null)onCreate で Fragment を追加するときに呼び出さないでください。これは FragmentManger に、そのフラグメントの前にジャンプして戻りたい別の状態があることを伝えます。

于 2012-10-16T18:12:54.823 に答える