#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 новому фрагменту и т.д.
Спасибо за вашу помощь 🙂
Ответ №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) {
}
}
});
Я обнаружил, что ящик использует навигационный контроллер для изменения отображаемого фрагмента.
Мне удалось получить его и изменить, чтобы получить то же поведение, что и при нажатии на меню 🙂