親アクティビティを動的に設定する 質問する

親アクティビティを動的に設定する 質問する

現時点では、2 つの異なるアクティビティからアクセスできるアクティビティがありますが、問題はマニフェスト XML ファイルで親アクティビティとして設定できるアクティビティが 1 つだけであることです。アクティビティによって、ユーザーが以前いた間違ったアクティビティに戻される可能性があるため、これは明らかに不適切な UX/UI デザインです。そのため、どのアクティビティが親アクティビティであるかを動的に設定しようとしています。

問題は、コードであれ XML であれ、これをどのように実行すればよいかよくわからないことです。そのため、何かアドバイスがあればありがたいです。 :)

ベストアンサー1

将来の読者のために、公式/適切なソリューションを実際に実装する方法の例を示します。開発者ガイド(次の段落までスクロールしてください「これは、親アクティビティは異なる場合があります...)。

このソリューションでは、サポートライブラリを実装しActionBar、取り消すアクティビティがアプリに属していない「タスク」内にある場合にフォールバックする「デフォルト」の親アクティビティをマニフェスト XML ファイルで少なくとも設定できるようにします (詳細については、リンクされたドキュメントを参照してください)。

// Override BOTH getSupportParentActivityIntent() AND getParentActivityIntent() because
// if your device is running on API 11+ it will call the native
// getParentActivityIntent() method instead of the support version.
// The docs do **NOT** make this part clear and it is important!

@Override
public Intent getSupportParentActivityIntent() {
    return getParentActivityIntentImpl();
}

@Override
public Intent getParentActivityIntent() {
    return getParentActivityIntentImpl();
}

private Intent getParentActivityIntentImpl() {
    Intent i = null;

    // Here you need to do some logic to determine from which Activity you came.
    // example: you could pass a variable through your Intent extras and check that.
    if (parentIsActivityA) {
        i = new Intent(this, ActivityA.class);
        // set any flags or extras that you need.
        // If you are reusing the previous Activity (i.e. bringing it to the top
        // without re-creating a new instance) set these flags:
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        // if you are re-using the parent Activity you may not need to set any extras
        i.putExtra("someExtra", "whateverYouNeed");
    } else {
        i = new Intent(this, ActivityB.class);
        // same comments as above
        i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
        i.putExtra("someExtra", "whateverYouNeed");
    }

    return i;
}

注意: マニフェストXMLファイルでデフォルトの親アクティビティを設定しない場合は、以下も実装する必要があります。onCreateSupportNavigateUpTaskStack()システムはタスクのバックスタックを生成する方法がわからないためです。この部分については例を示していません。

finish()タイプソリューションに関する私の考え

onOptionsItemSelected()この問題の解決策を探しているときに、ボタンをオーバーライドしてインターセプトし、現在の操作だけで前の画面に戻ることがandroid.R.id.homeできるという戦略を推奨する回答がいくつか見つかりました。finish()Activity

多くの場合、これで望ましい動作が実現しますが、これは間違いなくない適切な UP ナビゲーションと同じです。親アクティビティの 1 つから子アクティビティに移動していた場合、はい、finish()適切な前の画面に戻りますが、通知から子アクティビティに入った場合はどうでしょうか。その場合、finish()UP ボタンを押すと、通知を押す前に表示していたホーム画面またはアプリに直接戻りますが、代わりにアプリ内の適切な親アクティビティに送られるはずです。

おすすめ記事