Navigation Drawer の「下位階層レベルへのクロスナビゲーション後のシステムバック」セクションでは、次のように述べています。
ユーザーがナビゲーションドロワーから下位階層の画面に移動し、画面に直接の親がある場合、Backスタックはリセットされ、Backはターゲット画面の親を指します。この戻る動作は、ユーザーが通知からアプリに移動したときと同じです。
FLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASKを使用してアクティビティを開始することでバックスタックをリセットできることはわかっていますが、Lower 1.1.1のバックスタックが作成されないため、ここでは使用できないようです。
スタックからTopView2を削除し、同時に、Lower 1.1.1を開始するときにTopView1-> Lower 1.1バックスタックを追加する方法はありますか?これがNavigation Drawerドキュメントで言及されていることを考慮して、私は簡単な解決策を期待しています。
[〜#〜] edit [〜#〜]合成バージョン:
1)マニフェストファイルでアプリの階層ナビゲーション構造を宣言します。
2)アプリのルートアクティビティは、アプリ階層のTopViewsの間でビューの切り替えを実行する必要があります。*
)階層の下位のアクティビティは、「選択的上」ナビゲーションを実行する必要があります。
*重要:トランザクションがタブやナビゲーションドロワーのトップビューを切り替える場合など、トランザクションが水平ナビゲーション用である場合は、トランザクションをバックスタックに追加しないでください。
完全な説明:
次の理由により、ナビゲーションドロワーなどの新しいナビゲーションパターンではインテントフラグの使用を回避する必要があります。
launchMode
と重複/競合しています。代わりに、新しいナビゲーションAPIを選択します。
<activity>
ごとに指定された階層メタデータに基づいています。NavUtils
と同等)の機能を提供します。TaskStackBuilder
は、クロスタスクナビゲーション用の追加ユーティリティを提供します。だからあなたの質問に答えるための一般的なアイデアは:
1)次のように、Android:parentActivityName
属性(および対応する<meta-data>
要素)を使用して、マニフェストファイル内の各アクティビティの論理的な親を宣言する必要があります。
<application ... >
...
<!-- The main/home activity (it has no parent activity) -->
<activity
Android:name="com.example.myapp.RootDrawerActivity" ...>
...
</activity>
<!-- A child of the root activity -->
<activity
Android:name="com.example.myapp.Lower11 "
Android:label="@string/lower11"
Android:parentActivityName="com.example.myapp.RootDrawerActivity" >
<!-- Parent activity meta-data to support 4.0 and lower -->
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.myapp.RootDrawerActivity" />
</activity>
<activity
Android:name="com.example.myapp.Lower111 "
Android:label="@string/lower111"
Android:parentActivityName="com.example.myapp.Lower11" >
<meta-data
Android:name="Android.support.PARENT_ACTIVITY"
Android:value="com.example.myapp.Lower11" />
</activity>
</application>
2)ルートアクティビティで、ドロワーアイテムを選択すると、アクティビティの現在のフラグメントコンテンツを置き換えることにより、「表示切り替え」アクションが開始されます。
ビュースイッチは、リストまたはタブナビゲーションと同じ基本的なポリシーに従いますビュースイッチはナビゲーション履歴を作成しません。このパターンは、タスクのルートアクティビティでのみ使用し、ナビゲーション階層のさらに下のアクティビティ(ある場合は下位1.1と下位1.1.1)に対して何らかの形のアップナビゲーションをアクティブのままにします。ここで重要なことは、スタックからTopView2を削除する必要はなく、コメントとしてビューの切り替えを実行してから、ビューの位置(またはフラグメントID)をエクストラとして渡すことです。
ルートアクティビティで、次のようにします。
@Override
protected void onDrawerItemSelected(int position) {
// Update the main content by replacing fragments
CategoryFragment fragment = new CategoryFragment();
Bundle args = new Bundle();
args.putInt(RootDrawerActivity.ARG_SORT, position);
fragment.setArguments(args);
FragmentManager fragmentManager = getSupportFragmentManager();
fragmentManager.beginTransaction()
.replace(R.id.content_frame, fragment).commit();
// Update selected item and title, then close the drawer
setDrawerItemChecked(position, true);
setTitle(getResources().getStringArray(R.array.drawer_array)[position]);
closeDrawer();
}
)次に、階層の下位(つまり、Lower1.1)に「選択的上」ナビゲーションを実行する必要がありますプロセス内のタスクスタックの再作成。
Selective Upを使用すると、ユーザーはアプリのナビゲーション階層を自由にジャンプできます。アプリケーションは、これを別のタスクからのアップナビゲーションと同様に扱う必要があります現在のタスクスタックを置き換える(これが目的です!)TaskStackBuilderなどを使用します。これは、タスクのルートアクティビティ以外で使用する必要があるナビゲーションドロワーの唯一の形式です。
@Override
protected void onDrawerItemSelected(int position) {
TaskStackBuilder.create(this)
.addParentStack(RootDrawerActivity.class)
.addNextIntent(new Intent(this, RootDrawerActivity.class)
.putExtra(RootDrawerActivity.ARG_SORT, position))
.startActivities();
}
参照:
http://developer.Android.com/training/implementing-navigation/ancestral.htmlhttps://speakerdeck.com/jgilfelt/this-way-up-implementing-effective- Androidでのナビゲーション