как передать значение с помощью навигации Android, если значение по умолчанию равно нулю

#android #navigation #android-safe-args

Вопрос:

Я использую навигационные компоненты Android с безопасными аргументами. Я установил, что аргумент может быть равен нулю, и значение по умолчанию также равно нулю.

Проблема в том, что когда я хочу передать какое-либо значение, отображается ошибка:

 required: no arguments
found: Character
reason: actual and formal argument lists differ in length
 

Мой фрагмент XML-кода:

 <fragment
        android:id="@ id/bookListFragment"
        android:name="com.example.bookstory.UI.Fragments.BookListFragment"
        android:label="fragment_book_list"
        tools:layout="@layout/fragment_book_list">
            <argument
            android:name="character"
            app:argType="com.example.bookstory.DAO.Character"
            app:nullable="true"
            android:defaultValue="@null" />
</fragment>
 

Мое действие:

       <action
            android:id="@ id/action_bookDescriptionFragment_to_bookListFragment"
            app:destination="@id/bookListFragment"
            app:popUpTo="@id/bookListFragment"
            app:popUpToInclusive="true" />
 

Я не могу понять, в чем проблема — когда я удаляю значение по умолчанию, все в порядке.

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

1. Как вы передаете значение?.. вы не включили это

2. @Zain « Исправления имен классов. Имя действия действие = ClassNameDirections.Имя действия( символ); Navigation.findNavController(v).навигация(действие); «

Ответ №1:

ClassNameDirections.ActionName action = ClassNameDirections.actionName(character);
Navigation.findNavController(v).navigate(action);

Поскольку ваш идентификатор действия action_bookDescriptionFragment_to_bookListFragment

   <action
        android:id="@ id/action_bookDescriptionFragment_to_bookListFragment"
 

Затем его можно использовать в этой версии метода navigate (), которая использует NavDirections arg:

 findNavController().navigate(BookListFragmentDirections.actionBookDescrioptionFragmentToBookListFragment()
 

Это не передаст значение, но для этого:

Поскольку ваша ценность называется как character :

  <argument
        android:name="character"
        app:argType="com.example.bookstory.DAO.Character"
        app:nullable="true"
        android:defaultValue="@null" />
 

Затем вы можете каскадировать действие с setCharacter() помощью метода, сгенерированного safeArgs:

 findNavController().navigate(BookListFragmentDirections.actionBookDescrioptionFragmentToBookListFragment()
                    .setCharacter("c")
 

Я вижу, что вы используете safeArgs, но на всякий случай, если вы не хотите его использовать; вы можете использовать эту версию метода navigate() для установки значения через объект bundle

Ответ №2:

Я не знаю о safeArgs, но если вы не получите ответ с помощью safeArgs, вот как вы это делаете с обычным пакетом.

если вы не знаете, вы можете отправить пакет, содержащий ваши данные, вместе с действием навигации в качестве второго параметра метода.
как это

 char char_value = 'a' ;
Bundle data = new Bundle() ;
data.putChar("key",char_value);
NavHostFragment.findNavController(this)
                    .navigate(R.id.action_bookDescriptionFragment_to_bookListFragment,data);
 

и в booklistFragment вы просто вызываете getArguments() в любом месте фрагмента, чтобы получить этот пакет следующим образом

 public class BookListFragment extends Fragment {
    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
    Bundle data = getArguments() ;
    char receivedChar = data.getChar("key",'z'); // 'z' is a default value incase it didn't find the key you're looking for it returns 'z'
    }
 

там, где вы можете поместить в пакет множество вещей, просто введите «поместить» и посмотрите, что предлагает автозаполнение.

в случае использования пакета вам не нужно добавлять argument деталь в XML-файл nav_graph.