it-swarm.com.ru

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

Исходя из моих наблюдений из приложения 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 действия, например, AB и C, когда пользователь переходил от A к BI, помещал некоторые дополнительные функции, а onCreate из BI использовал эти дополнительные для запроса данных из базы данных, чтобы заполнить мои строки, и когда я возвращался из C, все дополнительные функции исчезали и Активность Б ничего не показывает.

36
sarunw

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

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

Android:launchMode="singleTop"

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

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

91
yonojoy

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

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

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

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

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

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

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

1
Alexander Zhak

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

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

0
rgrocha