Как перейти к тому же родительскому состоянию

Исходя из моих наблюдений из приложения Gmail и TED о поведении вверх по навигации, он будет переходить к родителю с тем же состоянием (положение прокрутки), не похожим на то, что говорит Google в своем документе " Осуществить навигацию вверх", например, создать родительское намерение и запустить его.

Я реализую код из примера кода Android, и все состояния исчезли (все дополнительные параметры, которые я предварительно установил, и положение прокрутки). Как правильно это сделать? Я не могу найти какой-либо документ на Android.

Ниже приведен код:

public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
    case android.R.id.home:
        Intent upIntent = new Intent(this, MyParentActivity.class);
        if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
            // This activity is not part of the application's task, so create a new task
            // with a synthesized back stack.
            TaskStackBuilder.from(this)
                    .addNextIntent(new Intent(this, MyGreatGrandParentActivity.class))
                    .addNextIntent(new Intent(this, MyGrandParentActivity.class))
                    .addNextIntent(upIntent)
                    .startActivities();
            finish();
        } else {
            // This activity is part of the application's task, so simply
            // navigate up to the hierarchical parent activity.
            NavUtils.navigateUpTo(this, upIntent);
        }
        return true;
}
return super.onOptionsItemSelected(item);

}

В моем случае у меня было 3 действия, например, A B и C, когда пользователь переходил от A к B I, ставил некоторые дополнительные функции и onCreate В B I эти дополнения используются для запроса данных из базы данных, чтобы заполнить мои строки, и когда я возвращаюсь назад из C, все дополнения исчезают, и действие B ничего не показывает.

5 ответов

Решение

"Стандартное" поведение для действия Android состоит в том, что создается новый экземпляр действия каждый раз, когда для этого действия создается новое намерение (см. LaunchMode-document здесь). Из-за этого ваши статисты, кажется, исчезли, если вы вызываете navigateUpTo.

В вашем случае я бы посоветовал использовать

android:launchMode="singleTop"

для вашей родительской активности в вашем AndroidManifest.xml. Таким образом, вы вернетесь к существующему действию (если оно находится на вершине заднего стека вашей задачи). Таким образом, ваши статисты будут сохранены.

Я тоже не понимаю, почему это не упоминается в документе Google, который вы цитируете, так как это поведение, которое можно ожидать при использовании навигации вверх.

Это альтернативное решение принятого ответа:

Если вы не можете изменить launchMode вашей деятельности или если родительская активность находится не над задним стеком (например, A является родительской для C), вы не можете использовать решение выше. В этом случае вы должны продлить navigateUpTo вызовите, чтобы сообщить активности, что она не должна быть воссоздана, если она находится в заднем стеке:

Intent intent = NavUtils.getParentActivityIntent(this); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
NavUtils.navigateUpTo(this, intent);

У меня была похожая проблема, когда я вызывал startActivityForResult() в своей основной деятельности с фрагментами, а затем пытался вернуться к ней из вызываемого, используя навигацию Up. Решено путем реализации навигации вверх как:

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case android.R.id.home:
            setResult(RESULT_CANCELED);
            finish();
            return true;
    }
    return super.onOptionsItemSelected(item);
}

В этом случае кнопка "Вверх" ведет себя как обычная кнопка "Назад", и все состояния сохраняются.

Вы можете использовать это:

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

Вам нужно будет сохранить состояние родительской активности и восстановить его после возврата из вызывающей.

См. Сохранение состояния активности Android с помощью Save Instance State для полного объяснения предварительной обработки с кодом.

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