Кнопка навигации вверх по компоненту 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
        }
    }
}
Другие вопросы по тегам