#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.