Кнопка навигации вверх по компоненту Android, стрелка отображается, но всплывающее окно не работает
Я использую навигационный компонент jetpack с очень простой настройкой, одним действием (MainActivity) и 4 фрагментами
MainFragment,
CardPreviewFragment,
createCardFragment,
и AddPredictionChipsFragment,
Компонент NavigationUI настраивает мой навигационный контроллер с моей панелью инструментов, у меня есть действия, установленные для каждого пункта назначения, и popTo, также установленные для каждого. Я могу успешно перейти к каждому из этих фрагментов, и название панели инструментов изменяется правильно, а значок "Домой" правильно отображает стрелку назад, но нажатие стрелки для использования действия popTo ничего не дает (SIDENOTE, если я установил анимацию поп-ввода и выхода и использовал кнопку "Назад" для возврата используется анимация). Любые идеи приветствуются, ниже приведен соответствующий код, отредактированный для краткости
ОСНОВНАЯ ДЕЯТЕЛЬНОСТЬ
public class MainActivity extends AppCompatActivity
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.content_main);
setNavigation();
}
private void setNavigation() {
navController = Navigation.findNavController(this, R.id.main_fragment);
NavigationUI.setupActionBarWithNavController(this, navController);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
return super.onCreateOptionsMenu(menu);
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
Intent i;
switch (item.getItemId()){
case R.id.preferences :
//code
return true;
case R.id.share :
//code
case R.id.create :
//code
case R.id.about :
//code
return true;
}
return super.onOptionsItemSelected(item);
}
Мое основное занятие использует панель действий, показывающую панель поиска и некоторые пункты меню, я не знаю, как-то это влияет (пытался удалить их без изменений)
основной контент содержит фрагмент навигационного хоста
<fragment
android:id="@+id/main_fragment"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/nav_main"/>
Фрагменты используют androidx: EditFragment расширяет Fragment и не использует опции меню или что-либо подобное, все они просто стандартные фрагменты, вот мой график навигации
<?xml version="1.0" encoding="utf-8"?>
<navigation
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/nav_main"
app:startDestination="@id/mainFragment">
<fragment
android:id="@+id/mainFragment"
android:name="com.sealstudios.simpleaac.ui.MainFragment"
android:label="Simple AAC"
tools:layout="@layout/fragment_main">
<action
android:id="@+id/action_mainFragment_to_cardPreviewFragment"
app:destination="@id/cardPreviewFragment"
app:popUpTo="@+id/mainFragment"
app:popUpToInclusive="false"/>
<action
android:id="@+id/action_mainFragment_to_createCardFragment"
app:destination="@id/createCardFragment"
app:popUpTo="@+id/mainFragment"
app:popUpToInclusive="false"/>
</fragment>
<fragment
android:id="@+id/cardPreviewFragment"
android:name="com.sealstudios.simpleaac.ui.CardPreviewFragment"
android:label="Preview Card"
tools:layout="@layout/preview_card_fragment">
<action
android:id="@+id/action_cardPreviewFragment_to_createCardFragment"
app:destination="@id/createCardFragment"
app:popUpTo="@+id/mainFragment"
app:popUpToInclusive="false"/>
</fragment>
<fragment
android:id="@+id/addPredictionChipsFragment"
android:name="com.sealstudios.simpleaac.ui.AddPredictionChipsFragment"
android:label="Add Predictions"
tools:layout="@layout/add_prediction_chips_fragment_layout"/>
<fragment
android:id="@+id/createCardFragment"
android:name="com.sealstudios.simpleaac.ui.CreateCardFragment"
android:label="Create / Edit"
tools:layout="@layout/fragment_create_card">
<action
android:id="@+id/action_createCardFragment_to_addPredictionChipsFragment"
app:destination="@id/addPredictionChipsFragment"
app:popUpTo="@+id/createCardFragment"
app:popUpToInclusive="false"/>
</fragment>
</navigation>
и вот пример того, как я называю одно из действий,
Navigation.findNavController(requireActivity(),R.id.main_fragment)
.navigate(R.id.action_mainFragment_to_cardPreviewFragment);
это действие перемещает в правильное место, получая правильный заголовок из метки, но не позволяет мне перемещаться назад / вверх с помощью стрелки, полный проект здесь
ОБНОВЛЕНИЕ Это воспроизводимо
Я могу создать новый проект, добавить компонент навигации и 2 фрагмента, добавить график навигации и добавить navhost к основному содержимому, и я получаю то же самое поведение (появляется стрелка, но ничего не появляется, включая сам график), который я использую "androidx.navigation: навигационный фрагмент:2.1.0-alpha03"и"androidx.navigation:navigation-ui:2.1.0-alpha03", и я сделал пример проекта здесь и поднял ошибку в трекере проблем
ОБНОВЛЕНИЕ Google вернулся ко мне и сказал, что это ожидаемое поведение, хотя я вполне уверен, что он не понял и определенно не выполнил пример, который я послал
2 ответа
Когда используешь setupWithActionBarWithNavController()
нужно переопределить onSupportNavigateUp()
чтобы вызвать значок Up на панели действий в соответствии с документацией:
@Override
public boolean onSupportNavigateUp() {
return Navigation.findNavController(this, R.id.main_fragment).navigateUp()
|| super.onSupportNavigateUp();
}
Кроме того, если вы хотите включить кнопку вверх для фрагментов, вы можете создать подкласс панели инструментов и
override fun onAttachedToWindow() {
super.onAttachedToWindow()
val navController = (context as AppCompatActivity).supportFragmentManager.findFragmentById(R.id.nav_host)!!.findNavController()
setupWithNavController(navController)
}
и напишите внутри него что-то вроде выше, предполагая, что вы используете
AppcompatActivity
у которого есть твой
NavHostFragment
поэтому у него есть навигационный контроллер, поэтому вы можете настроить его с помощью navcontroller здесь, вместо того, чтобы делать это в каждом фрагменте, как говорится в документации.
Панель инструментов подкласса имеет больше преимуществ, например, вы можете установить значок возврата для всех фрагментов в одном месте, также вы можете изменить шрифт и положение заголовка панели инструментов, что не поддерживается панелью инструментов из коробки.
это как-то вроде
override fun onLayout(changed: Boolean, l: Int, t: Int, r: Int, b: Int) {
super.onLayout(changed, l, t, r, b)
children.forEach {
if(it is TextView && !titleSet){
titleSet = true
it.x -= 50
it.typeface = ResourcesCompat.getFont(context, R.font.poppins_bold)
return@forEach
}
}
}