android - 使用 SafeArgs 导航到 Fragment 时检查参数是否存在

标签 android navigation android-jetpack android-safe-args

我迁移到导航组件,由于我现在使用 Fragment,我不再在 Fragment 中调用 onActivityResult()。

我定义了传递给 AddEditTaskFragment 的参数,并希望将修改后的参数发送回 TodayFragment。由于每次导航到 TodayFragment 时都会调用 onViewCreated() ,因此我想检查是否确实向它传递了参数以将任务保存在我的数据库中。

由于 AddEditTaskFragmentArgs.fromBundle(getArguments()) != null 不起作用,检查 fragment 是否正在接收参数的建议方法是什么?

这就是我导航回调用 fragment 的方式。

AddEditTaskFragmentDirections.ActionAddEditTaskFragmentToHomeFragment action = AddEditTaskFragmentDirections.actionAddEditTaskFragmentToHomeFragment();

action.setTitle(title);
if (id != -1) action.setId(id);
action.setPriority(priority);
action.setAddanote(duedate);
action.setDuedate(remindme);
action.setRemindme(addanote);
action.setModeEdit(modeEdit);

Navigation.findNavController(getView()).navigate(action);

现在我想做这样的事情:

if (AddEditTaskFragmentArgs.fromBundle(getArguments()) != ...?) {
    // Receive data from action
    String title = AddEditTaskFragmentArgs.fromBundle(getArguments()).getTitle().trim();
    int priority = AddEditTaskFragmentArgs.fromBundle(getArguments()).getPriority();
    String duedate = AddEditTaskFragmentArgs.fromBundle(getArguments()).getDuedate();
    String remindme = AddEditTaskFragmentArgs.fromBundle(getArguments()).getRemindme();
    String addanote = AddEditTaskFragmentArgs.fromBundle(getArguments()).getAddanote().trim();
    boolean modeEdit = AddEditTaskFragmentArgs.fromBundle(getArguments()).getModeEdit();
    int id = AddEditTaskFragmentArgs.fromBundle(getArguments()).getId();

    Task task = new Task(title, addanote, priority, duedate, remindme);
    taskViewModel.insert(task);

    Toast.makeText(getContext(), "Task saved.", Toast.LENGTH_SHORT).show();
}

最佳答案

不知道您是否已经找到答案,但这就是我通常的做法。

在您的 XML 导航资源文件中,需要在每个目标 fragment 中声明参数(在您的情况下,这似乎是两个 fragment ,因为 AddEditTaskFragmentArgs 应该接收一些参数,修改它们并将它们发送回 TodayFragment)。我假设你有这样的东西:

<?xml version="1.0" encoding="utf-8"?>
<navigation>

    <!-- ... -->

    <fragment
        android:id="@+id/actionAddEditTaskFragmentToHomeFragment"
        android:name="...AddEditTaskFragment"
        android:label="..."
        tools:layout="..." >
        <argument
            android:name="id"
            app:argType="integer"
            android:defaultValue="3" />
        <argument
            android:name="title"
            app:argType="string" 
            app:nullable="true" />

            <!-- Other  arguments -->

    </fragment>

    <!-- Other fragments -->

</navigation>

在源 fragment 中,您可以使用 setter 设置参数(就像您所做的那样)或直接在操作构造函数中传递它们(这取决于参数类型以及您是否为它们指定了默认值)。更多信息可参见official documentation .

由于我注意到您没有向构造函数提供任何参数,因此我猜测您已经为所有参数提供了默认值。

然后,在您的目标 fragment AddEditTaskFragment 中,您可以执行以下操作:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    // Get arguments from bundle, if any
    if (getArguments() != null) {
        AddEditTaskFragmentArgs args = AddEditTaskFragmentArgs.fromBundle(getArguments()); 

        if (args.getTitle() != null) {
            String title = args.getTitle();
        } else {
            // Title is null because it's a String, that we allowed nullable and because user did not set it
        }

        int id = args.getId(); // An int cannot be null and we specified a default value

        // Check other arguments ...
    }
    else {
        // No argument was provided
        // Use default values or throw an error
    }
}

如果您绝对希望确保接收参数,则可以使用 requireArguments() 代替。如果传递给 fragment 的 Bundle 对象为 null,这将在运行时引发错误。但是,这并不能阻止您的所有参数都不会为空(请参阅上面的 android 文档链接),因此您必须执行对您真正重要的检查,就像以前一样:

@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
    AddEditTaskFragmentArgs args = AddEditTaskFragmentArgs.fromBundle(requireArguments()); 

    if (args.getTitle() != null) {
        String title = args.getTitle();
    } else {
        // Title is null because it's a String, that we allowed nullable and because user did not set it
    }

    int id = args.getId(); // An int cannot be null and we specified a default value

    // Check other arguments ...
}

希望有帮助:)

关于android - 使用 SafeArgs 导航到 Fragment 时检查参数是否存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55781830/

相关文章:

Android SVG 图形 - 将当前 PNG 文件转换为 svg 格式的缺点

css - 无法弄清楚为什么导航栏不起作用

没有固定宽度的CSS水平子菜单

Android Room DB - 在查询中使用另一个类的静态变量

android - ViewPager2 崩溃

java - 检查并查看是否正在播放声音,等待它完成然后播放另一个

android - Android Studio 1.5.1 上的 AVD Manager 并安装到自定义位置模拟器将无法运行

android - 在 Fragment 中添加 GridView

iphone - 导航和MapKit使应用程序崩溃

Android 导航架构组件 - 获取当前可见 fragment