web-dev-qa-db-ja.com

アクティビティの削除とバックスタックへの追加

Navigation Drawer の「下位階層レベルへのクロスナビゲーション後のシステムバック」セクションでは、次のように述べています。

ユーザーがナビゲーションドロワーから下位階層の画面に移動し、画面に直接の親がある場合、Backスタックはリセットされ、Backはターゲット画面の親を指します。この戻る動作は、ユーザーが通知からアプリに移動したときと同じです。

resetting the back stack

FLAG_ACTIVITY_CLEAR_TOPとFLAG_ACTIVITY_NEW_TASKを使用してアクティビティを開始することでバックスタックをリセットできることはわかっていますが、Lower 1.1.1のバックスタックが作成されないため、ここでは使用できないようです。

スタックからTopView2を削除し、同時に、Lower 1.1.1を開始するときにTopView1-> Lower 1.1バックスタックを追加する方法はありますか?これがNavigation Drawerドキュメントで言及されていることを考慮して、私は簡単な解決策を期待しています。

20
aleb

[〜#〜] edit [〜#〜]合成バージョン:

1)マニフェストファイルでアプリの階層ナビゲーション構造を宣言します。

2)アプリのルートアクティビティは、アプリ階層のTopViewsの間でビューの切り替えを実行する必要があります。*

)階層の下位のアクティビティは、「選択的上」ナビゲーションを実行する必要があります。

*重要:トランザクションがタブやナビゲーションドロワーのトップビューを切り替える場合など、トランザクションが水平ナビゲーション用である場合は、トランザクションをバックスタックに追加しないでください。


完全な説明:

次の理由により、ナビゲーションドロワーなどの新しいナビゲーションパターンではインテントフラグの使用を回避する必要があります。

  • インテントフラグは、実際にはAPIではありません。
  • 一部のフラグは正確な組み合わせでのみ機能します。
  • 多くのフラグは、ほとんどのサードパーティアプリには関係ありません。
  • アクティビティlaunchModeと重複/競合しています。
  • 紛らわしいドキュメント。
  • 実装は試行錯誤のプロセスになる可能性があります。

代わりに、新しいナビゲーションAPIを選択します。

  • Jelly Bean以上のネイティブアップナビゲーション。
  • マニフェストの<activity>ごとに指定された階層メタデータに基づいています。
  • サポートライブラリは、以前のAndroidバージョン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でのナビゲーション

56
IsaacCisneros