184

Android アプリケーションに 2 つのアクティビティ (A と B) があり、アクティビティ A からアクティビティ B に移動するインテントを使用しています。parent_activity の使用が有効になっています。

 <activity
        android:name=".B"
        android:label="B" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
  </activity>

UPボタンを提供するテーマも使用しています。

したがって、アクティビティ BI を呼び出した後、UP ボタンを使用してアクティビティ A に戻ることができます。問題は、アプリケーションがアクティビティ A のonCreate()関数を再度呼び出すように見えることです。これは私が必要とする動作ではありません。アクティビティ A は、アクティビティ B を呼び出す前と同じように見える必要があります。

これを達成する方法はありますか?

編集

アクティビティ A からアクティビティ B を開始するコードは書いていません。Eclipse によって自動生成されていると思います。

クラス B は次のようになります。

    @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_b);
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.activity_b, menu);
    return true;
}


@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            NavUtils.navigateUpFromSameTask(this);
            return true;
    }
    return super.onOptionsItemSelected(item);
}
4

15 に答える 15

83

更新された回答: 上へのナビゲーションの設計

どのアクティビティが各アクティビティの適切な親であるかを宣言する必要があります。そうすることで、システムはマニフェスト ファイルから論理的な親のアクティビティを判断できるため、Up などのナビゲーション パターンを容易にすることができます。

そのためには、属性を持つタグアクティビティで親アクティビティを宣言する必要があります

android:parentActivityName

お気に入り、

<!-- The main/home activity (it has no parent activity) -->
    <activity
        android:name="com.example.app_name.A" ...>
        ...
    </activity>
    <!-- A child of the main activity -->
    <activity
        android:name=".B"
        android:label="B"
        android:parentActivityName="com.example.app_name.A" >
        <!-- Parent activity meta-data to support 4.0 and lower -->
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.app_name.A" />
    </activity>

親アクティビティをこのように宣言すると、以下のように適切な親までナビゲートできます。

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        NavUtils.navigateUpFromSameTask(this);
        return true;
    }
    return super.onOptionsItemSelected(item);
}

したがってNavUtils.navigateUpFromSameTask(this);、このメソッドを呼び出すと、現在のアクティビティが終了し、適切な親アクティビティが開始 (または再開) されます。ターゲットの親アクティビティがタスクのバック スタックにある場合は、 で定義されているように前に出されFLAG_ACTIVITY_CLEAR_TOPます。

Upボタンを表示するには、宣言する必要がありますsetDisplayHomeAsUpEnabled():

@Override
public void onCreate(Bundle savedInstanceState) {
    ...
    getActionBar().setDisplayHomeAsUpEnabled(true);
}

古い回答: (上へのナビゲーションなし、デフォルトの [戻る] ナビゲーション)

アクティビティ B から再度アクティビティ A を開始する場合にのみ発生します。

を使用してstartActivity()います。

アクティビティ A からの代わりに、アクティビティ A を使用してアクティビティ B を開始しstartActivityForResult()、オーバーライドonActivtyResult()します。

アクティビティ B でfinish()、ボタン Up を呼び出すだけです。これonActivityResult()で、アクティビティ A を再度作成せずにアクティビティ A に移動しました。

于 2012-09-05T07:00:39.633 に答える
19

古い質問ですが、 WidgetからActivity B をディープリンクしたため、以前のすべての回答がうまくいかなかったため、別の (最もクリーンで最良の) 解決策を次に示します。

public void navigateUp() {
final Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
    Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
  } else {
    NavUtils.navigateUpTo(this, upIntent);
  }
}

[ https://stackoverflow.com/a/31350642/570168 ]

しかし、以下も参照してください: https://speakerdeck.com/jgilfelt/this-way-up-implementing-effective-navigation-on-android

于 2016-02-13T16:13:12.153 に答える
7

これを実現するためのより良い方法は、次の 2 つのことを使用することです。

NavUtils.navigateUpFromSameTask(this);

これを機能させるには、マニフェスト ファイルに、アクティビティ A に親アクティビティ B があることを示す必要があります。親アクティビティには何も必要ありません。バージョン 4 以降では、追加の手間をかけずに素敵な戻る矢印が表示されます (これは、より低いバージョンでも少しのコードで実行できます。以下に記載します)。このデータは、マニフェスト -> アプリケーション タブで設定できます。 GUI で (親アクティビティ名まで下にスクロールし、手で入力します)

サポート ノード:

バージョン 4 より前のバージョンをサポートする場合は、メタデータも含める必要があります。アクティビティを右クリックし、add->meta data、name =android.support.PARENT_ACTIVITY、value = your.full.activity.name

下位バージョンでも素敵な矢印を取得するには:

getSupportActionBar().setDisplayHomeAsUpEnabled(true);

これをすべて機能させるにはサポート ライブラリ バージョン 7 が必要ですが、それだけの価値はあります。

于 2013-09-22T14:50:45.800 に答える
4

試してみandroid:launchMode="singleTask"ましたが、役に立ちませんでした。を使用して私のために働いたandroid:launchMode="singleInstance"

于 2015-03-04T08:20:04.490 に答える
4

@LorenCKの回答に追加、変更

NavUtils.navigateUpFromSameTask(this);

アクティビティを別のアクティビティから開始でき、これが他のアプリによって開始されたタスクの一部になる可能性がある場合は、以下のコードに

Intent upIntent = NavUtils.getParentActivityIntent(this);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    TaskStackBuilder.create(this)
            .addNextIntentWithParentStack(upIntent)
            .startActivities();
} else {
    NavUtils.navigateUpTo(this, upIntent);
}

これにより、新しいタスクが開始され、最小 SDK バージョン <= 15 の以下のようにマニフェストで定義できるアクティビティの親アクティビティが開始されます

<meta-data
        android:name="android.support.PARENT_ACTIVITY"
        android:value="com.example.app_name.A" />

またはparentActivityNameif its > 15を使用

于 2016-03-22T19:13:57.123 に答える
3

親アクティビティ名が不適切なAndroid 5.0を使用すると、同様の問題が発生しました

<activity
        android:name=".DisplayMessageActivity"
        android:label="@string/title_activity_display_message"
        android:parentActivityName=".MainActivity" >
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="com.example.myfirstapp.MainActivity" />
    </activity>

親アクティビティ名から com.example.myfirstapp を削除したところ、正しく機能しました

于 2014-10-29T16:27:51.287 に答える
2

属性を使用してアクティビティ マニフェスト情報に追加します

android:launchMode="singleTask"

私にとってはうまくいっています

于 2014-03-08T06:11:18.943 に答える