Как я могу вернуться от действия к другому занятию, которое находится в сохраненном состоянии? - PullRequest
1 голос
/ 09 июля 2019

Итак, я сделал нижнюю навигационную панель в своей основной деятельности и настроил фрагменты.Работает и все нормально.Только одна проблема, однако.Когда я перехожу к следующему занятию, к настройкам, у меня есть панель инструментов с кнопкой возврата, код выглядит так:

@Override
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        finish();
        return true;
    }

    return super.onOptionsItemSelected(item);
}

И это успешно возвращает меня к предыдущему занятию.Но проблема в том, что я возвращаюсь не на фрагменте профиля (откуда пользователь нажал кнопку настроек), а на домашний.Дело в том, что я делаю в MainActivity.java следующее:

getSupportFragmentManager().beginTransaction().replace(R.id.frameView, new HomeFragment())
.commit();

И это возвращает меня к домашнему фрагменту, даже если я хочу перейти с функцией finish () к предыдущему используемому фрагменту: настройкифрагмент.Но если я удаляю эту строку, я не могу загрузить домашний фрагмент в начале / запуске приложения.Итак, я нахожусь в некоторой дилемме.

Итак, вот мой нижний код навигации:

private BottomNavigationView.OnNavigationItemSelectedListener navigationViewListener = new BottomNavigationView.OnNavigationItemSelectedListener() {
    @Override
    public boolean onNavigationItemSelected(@NonNull MenuItem item) {
        return SelectItem(item.getItemId());
    }
};

Тогда у меня есть этот метод:

private boolean SelectItem(int id) {
    Fragment selectedFragment = null;

    switch (id) {
        case R.id.nav_home:
            selectedFragment = new HomeFragment();
            break;
        case R.id.nav_files:
            selectedFragment = new FilesFragment();
            break;
        case R.id.nav_message:
            selectedFragment = new MessageFragment();
            break;
        case R.id.nav_profile:
            selectedFragment = new ProfileFragment();
            break;
    }

    getSupportFragmentManager().beginTransaction().replace(R.id.frameView, selectedFragment).commit();
    return true;
}

ИтакЯ включаю функцию onCreate () и делаю это:

BottomNavigationView navigationView = findViewById(R.id.navigation_view); 
navigationView.setOnNavigationItemSelectedListener(navigationViewListener);
SelectItem(R.id.nav_home);

Примечание: То, что настройки - это другое действие, а не фрагмент.Я просто загружаю его из фрагмента профиля.И когда я возвращаюсь из действия настройки, я просто хочу перейти к основному действию с тем же фрагментом, с которым я его оставил (имеется в виду фрагмент профиля).

Вопрос был решен мной.Если кто-то хочет предложить улучшения, он может ответить.

Ответы [ 2 ]

1 голос
/ 09 июля 2019

Итак, после многих попыток я нашел этот простой способ делать то, что хотел. Это не так чисто, но это работает. Это просто определить переменную

boolean firstTime = true;

Затем перейдите к методу onCreate () и скажите:

if (firstTime) {
   SelectItem(R.id.home);
}

Работает как шарм.

0 голосов
/ 09 июля 2019

Вы можете обернуть строку добавления фрагмента следующим условием:

if (getSupportFragmentManager().getBackStackEntryCount() == 0){
     getSupportFragmentManager().beginTransaction().replace(R.id.frameView, new HomeFragment()).commit();
}

Приведенная выше строка проверит, если к ней уже прикреплен фрагмент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...