Правильная навигация вверх от фрагмента к активности

В настоящее время я работаю над приложением, состоящим из базовой активности, которая управляет несколькими фрагментами. Один из таких фрагментов представляет собой список, который при нажатии на элемент запускает действие сведений. Я хотел бы, чтобы, когда я нажимаю кнопку «Домой» ( Использование ABS ), приложение возвращалось к фрагменту списка, но вместо этого оно всегда возвращалось к фрагменту, который я указал по умолчанию.

Base Activity
    Frag1 - Default
    Frag2
    Frag3 -> DetailsActivity

Когда кнопка «Домой» нажата из DetailsActivity, я хочу вернуться к Frag3, вместо этого я иду к Frag1.

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

Основная деятельность:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // set the Above View
    if (savedInstanceState != null)
        mContent = getSupportFragmentManager().getFragment(savedInstanceState,               "mContent");
    if (mContent == null)
        mContent = new HomeFragment();

    // set the Above View
    setContentView(R.layout.content_frame);
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.content_frame, mContent)
            .commit();

    // set the Behind View
    setBehindContentView(R.layout.menu_frame);
    getSupportFragmentManager()
            .beginTransaction()
            .replace(R.id.menu_frame, new SlidingMenuFragment())
            .commit();

    // customize the SlidingMenu
    getSlidingMenu().setTouchModeAbove(SlidingMenu.TOUCHMODE_FULLSCREEN);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    getSupportFragmentManager().putFragment(outState, "mContent", mContent);
    super.onSaveInstanceState(outState);
}

public void switchContent(Fragment fragment) {
    getSlidingMenu().showContent();

    mContent = fragment;
    getSupportFragmentManager()
            .beginTransaction()
            .addToBackStack("test")
            .replace(R.id.content_frame, fragment)
            .commit();
}

Подактивность:

@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.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);
}

person Nath5    schedule 31.08.2013    source источник


Ответы (3)


Перехватите событие --home-- в деталях активности, вызвав 'finish()'.

Реализовать «результат активности ()» во фрагменте № 3.

Вы вернетесь от подробной активности к frag3.

person Robert Rowntree    schedule 01.09.2013
comment
Однако мне удалось заставить это работать, не похоже, что это лучшая практика. Я не ожидаю результата от действия с деталями, поэтому я бы предпочел не использовать этот метод, если он действительно не единственный. Спасибо за трюк, хотя он действительно работает! - person Nath5; 01.09.2013
comment
хорошо, тогда посмотрите на использование интерфейса в frag3, чтобы фактически вернуться к BaseActivity по событию frag#3.HOME, а затем запустить Intent для DetailActivity из базы. Когда Detail Activity завершится, используйте frag transactionManager, чтобы «добавить» frag#3 после Detail. - person Robert Rowntree; 01.09.2013

Вам нужно добавить свои фрагменты в стопку. См. Реализация обратной навигации для фрагментов.

person electrofant    schedule 31.08.2013
comment
Я думаю, что проблема заключается в том, что saveInstanceState всегда имеет значение null, когда я возвращаюсь к основной деятельности. Я добавил еще немного кода выше. - person Nath5; 31.08.2013

Как насчет того, чтобы передать дополнение к вашей родительской активности (базовой активности), например идентификатор вашего фрагмента?

Подактивность:

@Override
public boolean onOptionsItemSelected(com.actionbarsherlock.view.MenuItem item) {
    switch (item.getItemId()) {
        // Respond to the action bar's Up/Home button
        case android.R.id.home:
        // Retrieve this Activiy's parent Up intent
        Intent upIntent = NavUtils.getParentActivityIntent(this);
        // Add the required Intent extras as appropriate
        upIntent.putExtra("KEY", id);
        NavUtils.navigateUpTo(this, upIntent);

            return true;
    }
    return super.onOptionsItemSelected(item);
}

NavUtils.navigateUpFromSameTask(this) эквивалентно вызову navigateUpTo(sourceActivity, getParentActivityIntent (sourceActivity)).

person IsaacCisneros    schedule 06.12.2013