Используя компонент навигации и пункты меню, как с помощью кнопки «Вверх» вернуться на go к предыдущему фрагменту, а не к «основному» фрагменту - PullRequest
0 голосов
/ 08 мая 2020

Я использую архитектуру компонентов навигации. У меня есть пункт меню на панели действий, где пользователь может щелкнуть go, чтобы перейти к настройкам. Я использую подход "одно действие ко многим фрагментам". Итак, эта панель действий с пунктом меню присутствует во всех моих фрагментах.

Допустим, у меня есть 3 фрагмента. а фрагмент A является основным фрагментом. Пока я нахожусь в настройках, кнопка «ВВЕРХ» всегда возвращает меня к фрагменту A. Даже если я вызвал его из фрагмента B или C.

Вот что я имею в виду под кнопкой вверх (здесь она называется здесь ):

enter image description here

И вот мой фактический NavGraph

enter image description here

Из этого вы можете видеть, что Frag A связан действием с настройками. Я сделал это, потому что это домашний фрагмент, где начинается активность хоста для фрагментов. В любом случае, это не имеет значения. Я удалил это действие, и оно по-прежнему ведет себя точно так же. из фрагмента C вернуться к фрагменту C. Вместо фрагмента A?

Ответы [ 2 ]

0 голосов
/ 12 мая 2020

NavigationUI содержит метод onNavDestinationSelected для обработки пунктов меню. По умолчанию этот метод выталкивает весь задний стек. Исправление состоит в том, чтобы добавить android:menuCategory="secondary" к вашему xml для элементов в вашем меню, как указано здесь:

enter image description here

0 голосов
/ 09 мая 2020

Итак, как мне, если зайти в настройки из фрагмента C, вернуться к фрагменту C. Вместо фрагмента A?

Я предполагаю, что вы уже добавили действие навигации от Fragment C до Settings fragment , чтобы вы могли перемещаться из Fragment C на SettingsFragment.

Итак, вот демонстрационный пример этого действия на графике навигации:

<fragment
    android:id="@+id/cFragment"
    android:name="...."
    android:label="fragment_c"
    tools:layout="@layout/fragment_c" >

    ....

    <action
        android:id="@+id/action_cFragment_to_settingsFragment"
        app:destination="@id/settingsFragment"
        app:popUpTo="@id/cFragment" />
</fragment>

Теперь вы хотите нажать кнопку вверх / домой на SettingsFragment, чтобы вернуться к Fragment C (или любой другой фрагмент, вызывающий SettingsFragment.

Вы можете использовать задний стек, чтобы сделать это; где верхний фрагмент в заднем стеке теперь равен FragmentC, который определяется действием action_cFragment_to_settingsFragment.

Вы можете использовать onBackPressed() единственного действия для достижения этого, так что теперь SettingFragment может вернуться к любому следующему фрагменту в заднем стеке.

Для этого: Создайте SettingsFragment, как показано ниже:

public class SettingsFragment extends Fragment {

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        return inflater.inflate(R.layout.fragment_settings, container, false);
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        setHasOptionsMenu(true);
        ((AppCompatActivity) requireActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(true);

    }

    @Override
    public boolean onOptionsItemSelected(@NonNull MenuItem item) {
        if (item.getItemId() == android.R.id.home) {
            requireActivity().onBackPressed(); // Back to the next fragment at the back stack
            return true;
        }
        return super.onOptionsItemSelected(item);
    }

}

Примечание: если вы видите кнопку «Домой» на других фрагментах, вы можете удалить ее:

setHasOptionsMenu(false);
((AppCompatActivity) requireActivity()).getSupportActionBar().setDisplayHomeAsUpEnabled(false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...