Кнопка вверх Android не работает

У меня есть простое приложение. Он состоит из Деятельности A и Деятельности B.

Когда я начинаю с Упражнения A (с иконки запуска), затем перехожу к Упражнению B, а затем нажимаю кнопку вверх. Я прихожу к Деятельности А. Отлично.

Тем не менее, когда я запускаю упражнение B из командной строки (имитация другого приложения или уведомление, запускающее это занятие) и нажимаю кнопку "вверх", меня просто переводят на домашний экран.

Вот моя установка:

Деятельность А

public class ActivityA extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
        fab.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intent = new Intent(ActivityA.this, ActivityB.class);
                startActivity(intent);
            }
        });

    }


}

Деятельность Б

public class ActivityB extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_b);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    }
}

Мой манифест. Обратите внимание, что родительская активность определена, и мое приложение min api равно 16 (поэтому объявление родительской активности действительно для 16 и выше).

   <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".ActivityA"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".ActivityB"
            android:exported="true"
            android:label="@string/title_activity_b"
            android:parentActivityName=".ActivityA"
            android:theme="@style/AppTheme.NoActionBar" />
    </application>

Для запуска Activity B из строки cmd я использую: adb shell am start com.example.demo/com.example.demo.ActivityB

РЕДАКТИРОВАТЬ 1

Согласно документам здесь: https://developer.android.com/training/appbar/up-action.html

Вам не нужно перехватывать действие up в методе onOptionsItemSelected() действия. Вместо этого этот метод должен вызывать свой суперкласс, как показано в разделе "Ответить на действия". Метод суперкласса отвечает на выбор Up путем перехода к родительскому действию, как указано в манифесте приложения.

Изменить 2:

Я просто попробовал два фрагмента кода здесь. Один за другим, чтобы увидеть, будут ли они добиваться цели. Но они этого не делают. ActivityA не открывается. Activity B просто закрывается.

https://developer.android.com/training/implementing-navigation/ancestral.html

@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);
}

а также

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
    // Respond to the action bar's Up/Home button
    case android.R.id.home:
        Intent upIntent = NavUtils.getParentActivityIntent(this);
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
            // This activity is NOT part of this app's task, so create a new task
            // when navigating up, with a synthesized back stack.
            TaskStackBuilder.create(this)
                    // Add all of this activity's parents to the back stack
                    .addNextIntentWithParentStack(upIntent)
                    // Navigate up to the closest parent
                    .startActivities();
        } else {
            // This activity is part of this app's task, so simply
            // navigate up to the logical parent activity.
            NavUtils.navigateUpTo(this, upIntent);
        }
        return true;
    }
    return super.onOptionsItemSelected(item);
}

Что происходит против ожидаемого? Когда я открываю Activity B через строку cmd и нажимаю, я ожидаю перейти к ActivityA, в то время как Activity B закрывается. На самом деле происходит то, что Activity B просто закрывается.

1 ответ

Это поведение по умолчанию, кнопка навигации вверх работает с Activity Stackесли ActivityA не в стеке, Android вернётся к предыдущему экрану, в данном случае Home.

Другие вопросы по тегам