私は、ウィジェットをサポートFragment
し、選択の詳細を表示するためにユーザーを送信する検索結果を表示するアプリに取り組んでいます。これらはすべて正常に動作しますが、バックスタックに関して、Nexus 6 エミュレーターと実際のデバイスの間で一貫性のない動作が見られます。エミュレーターでは、FragmentActivity の詳細で [戻る] ボタンを押すと、ユーザーが検索結果フラグメントに戻され、すべてが期待どおりに機能します。実際の Nexus 6 デバイスでは、ユーザーはアプリのメニューを含む に戻ります (このアクティビティは、管理するフラグメントをバックスタックに追加する support を使用します)。SearchView
RecyclerView
FragmentActivity
AppCompatActivity
FragmentManager
private void replaceFragment(Fragment supportFragment) {
String fragmentName = supportFragment.getClass().getSimpleName();
supportFragmentManager.beginTransaction()
.addToBackStack(fragmentName)
.replace(R.id.frame_menu_container, supportFragment, fragmentName)
.commit();
}
Fragment から FragmentActivity にユーザーを送信するコードは、エクストラを含むインテントです。
Intent intent = new Intent(getActivity(), PlayerDetailsActivity.class);
intent.putExtra(TransientPlayer.BUNDLE_KEY, transientPlayer);
startActivity(intent);
私はバックスタックで特別なことをしていません (まだ) - これはデフォルトの動作です。
ここで何が問題になる可能性がありますか? バックスタックでいくつかの読み取りを行いましたが、FragmentActivy から FragmentManager を使用していない Fragment に戻るときに、手動でバックスタックに何かを追加することについてはまだ何も見ていません。
編集 1:frame_menu_container
が定義されているレイアウト XML は次のとおりです。
<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:gravity="center"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.Toolbar
android:id="@+id/toolbar"
android:layout_width="match_parent"
android:layout_height="?attr/actionBarSize"
android:background="?attr/colorPrimary"
android:theme="@style/ThemeOverlay.AppCompat.Dark.ActionBar"
app:popupTheme="@style/ThemeOverlay.AppCompat.Light"/>
<FrameLayout
android:id="@+id/frame_menu_container"
android:layout_below="@id/toolbar"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:layout="@layout/fragment_home">
</FrameLayout>
</RelativeLayout>
編集 2: OK、これが私の高レベルのアクティビティとフラグメントのテキストによる説明です。
NavigationMenuActivity
、拡張しAppCompatActivity
ます。これは、すべてのフラグメントが必要に応じてスワップ インおよびスワップ アウトされる場所であり、メソッドSupportFragmentManager
が使用される場所です。replaceFragment()
次のフラグメントがあります。これらはすべて、静的情報を表示するか、REST 呼び出しを行ってデータを取得および表示するか、ユーザーがフィードバックを送信できるようにします。すべて extendsandroid.support.v4.app.Fragment
であり、ユーザーが移動できる他のフラグメントやアクティビティはありません。
- ホームフラグメント
- カレンダーフラグメント
- 順位フラグメント
- PlayerSearchFragment (下記参照)
- フラグメントについて
- フィードバックフラグメント
これらのフラグメントの機能の唯一の例外は、PlayerSearchFragment
も拡張するandroid.support.v4.app.Fragment
です。このフラグメントには、RecyclerView
ユーザーがプレーヤーを検索するときに REST 呼び出しの結果を表示する が含まれています。結果が返され、ユーザーがリストから項目を選択すると、結果はPlayerDetailsActivity
which extendsに送信されますFragmentActivity
。
はPlayerDetailsActivity
、FragmentTabHost
表示可能なプレーヤーに関するさまざまなタイプの情報を含むビューを使用します。これは、このパスの「終点」です。ユーザーが移動できる他のフラグメントやアクティビティはありません。ここが問題です。このアクティビティで [戻る] ボタンを押すと、ユーザーがPlayerSearchFragment
フラグメント (検索結果) に戻るようにすることが意図されています。NavigationMenuActivity
実際の Nexus 6デバイスを使用している場合は、アクティビティに戻ります。
PlayerDetailsActivity
戻るボタンが押されたときに呼び出される次のメソッドがありますが、常にゼロのエントリが表示されます。
@Override
public void onBackPressed() {
FragmentManager fragmentManager = getSupportFragmentManager();
int count = fragmentManager.getBackStackEntryCount();
Log.i(TAG, "Backstack : There are " + count + " entries");
for (int i = 0; i > count; i++) {
FragmentManager.BackStackEntry backStackEntry = fragmentManager.getBackStackEntryAt(i);
Log.i(TAG, String.format("Backstack : id=%d, name=%s, shortTitle=%s, breadcrumbTitle=%s",
backStackEntry.getId(),
backStackEntry.getName(),
backStackEntry.getBreadCrumbShortTitle(),
backStackEntry.getBreadCrumbTitle()));
}
super.onBackPressed();
}
ハードウェアであろうとエミュレータであろうと、すべてのデバイスで同じエクスペリエンスが得られることを願っています。