Переключить фрагмент, как это делает навигационный ящик (со стрелкой назад)

#java #android #android-fragments #navigation-drawer

#java #Android #android-фрагменты #навигация-ящик

Вопрос:

Я пытаюсь создать приложение и борюсь с проблемой. Я хочу перейти от «Accueil» (home), например, к «Depense» (Расход) нажатием кнопки. Как вы можете проверить в gif (в конце сообщения), если я сделаю это с помощью меню, у меня сверху появится стрелка назад. И, если я перейду из дома в «Avance» (Advance), у меня появится значок меню.

Мне удается выяснить, откуда это взялось, я использую стандартный навигационный ящик, и если я добавлю свой фрагмент в код is, у меня будет меню, если нет, у меня есть стрелка.

         mAppBarConfiguration = new AppBarConfiguration.Builder(
            R.id.nav_home, R.id.nav_gallery, R.id.nav_avance)
            .setDrawerLayout(drawer)
            .build();
  

R.id.nav_avance включен, а R.id.depense — нет. Вот почему у меня есть стрелка.

Я пытаюсь сделать то же самое, что и стандартный ящик, когда я нажимаю, но мне это не удается. Я уже пробовал это в своем фрагменте кода «Accueil» (home) :

         Button b = root.findViewById(R.id.player_1);
        b.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Fragment fragment = new DepenseFragment();

                FragmentManager fragmentManager = getFragmentManager();
                FragmentTransaction ft = fragmentManager.beginTransaction();
                ft.replace(R.id.nav_host_fragment, fragment);
                ft.commit();
           }
    });
  

Но если я нажму на кнопку, появится новый фрагмент, НО … у меня есть значок меню сверху и старый текст, который является «Accueil», а не «Depense».

Не могли бы вы, пожалуйста, помочь мне добиться этого? Для получения информации я хочу, чтобы в этом новом фрагменте число соответствовало кнопке, которую я нажал. Например, если я нажму player_1, я хочу передать 1 .. player_2 передать 2 новому фрагменту и т.д.

Спасибо за вашу помощь 🙂

изображение desc

Ответ №1:

Я думаю, что нет «встроенного» решения, т. Е. Вам нужно вручную изменять / обновлять значок в ActionBar при нажатии на вашу кнопку. Следовательно, я бы добавил следующий код к вашему onClick() методу:

 ActionBar actionbar = this.getSupportActionBar();
if (actionbar != null) {
    // get the drawable which you want to show
    Drawable icon = this.getResources().getDrawable(R.drawable.baseline_arrow_back_white_24);

    // if necessary, adapt it to your theme
    icon.setColorFilter(Color.WHITE, PorterDuff.Mode.SRC_ATOP);

    // set/update the icon
    actionbar.setHomeAsUpIndicator(backArrow);
    actionbar.setDisplayHomeAsUpEnabled(true);
    actionbar.setHomeButtonEnabled(true);
}
  

Пожалуйста, обратите внимание, что это this относится к вашему объекту activity, поэтому вам нужно адаптировать эту часть. Поскольку я не знаю b , где находится «where», я могу только догадываться, как вы должны его адаптировать. Например, если b он уже присутствует в вашей деятельности, вы можете заменить this на MainActivity.this .

Если this.getSupportActionBar() возвращает null, вы можете адаптировать свой XML-макет. Пожалуйста, смотрите здесь в качестве отправной точки: https://developer.android.com/training/appbar/setting-up

Пожалуйста, посмотрите здесь подробное описание используемых методов (например, setDisplayHomeAsUpEnabled ): https://developer.android.com/reference/android/app/ActionBar

Пожалуйста, обратите внимание, что приведенный выше чертеж взят отсюда (доступны оба значка): https://material.io/resources/icons/?style=baseline

Комментарии:

1. Спасибо за ваш ответ, я пробовал другой метод, чтобы достичь того, чего я хочу, и я нашел решение. Я поделюсь этим в этом вопросе

Ответ №2:

Вот мой собственный ответ после (нескольких) часов исследований и попыток.

         Button b = root.findViewById(R.id.player_1);
        b.setOnClickListener(new View.OnClickListener() {
        @Override
            public void onClick(View v) {
                NavOptions.Builder builder = new NavOptions.Builder();
                NavController navController = Navigation.findNavController(root);

                NavOptions options = builder.build();
                try {
                    navController.navigate(R.id.nav_joueur, null, options);
                } catch (IllegalArgumentException e) {
                }
        }
    });
  

Я обнаружил, что ящик использует навигационный контроллер для изменения отображаемого фрагмента.
Мне удалось получить его и изменить, чтобы получить то же поведение, что и при нажатии на меню 🙂