如果默认值为 null,如何使用 android 导航传递值

how to pass a value using android navigation if the default value null

我正在使用 android 具有安全参数的导航组件。 我将参数设置为 null-able 并且默认值也为 null。

问题是当我想传递任何值时显示错误:

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" />

我不明白这是什么问题 - 当我删除默认值时就可以了。

我不知道 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'
    }

您可以将各种东西放在一起,只需键入 'put' 并查看自动完成的建议。

在使用捆绑包的情况下,您不需要在 nav_graph xml.

中添加 argument 部分

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

因为您的操作 ID 是 action_bookDescriptionFragment_to_bookListFragment

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

然后它可以在 this 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" />

然后您可以使用生成的 safeArgs setCharacter() 方法级联操作:

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

我看到您使用了 safeArgs,但以防万一您不想使用它;您可以使用 this navigate() 方法版本通过 bundle 对象设置值