Подтвердить что ты не робот

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

Из моего наблюдения с приложения 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 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 task, so simply
            // navigate up to the hierarchical parent activity.
            NavUtils.navigateUpTo(this, upIntent);
        }
        return true;
}
return super.onOptionsItemSelected(item);

}

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

4b9b3361

Ответ 1

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

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

android:launchMode="singleTop"

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

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

Ответ 2

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

Если вы не можете изменить 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);

Ответ 3

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

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

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

Ответ 4

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

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