我迁移到导航组件,由于我现在使用片段,我不再在我的片段中调用 onActivityResult()。
我定义了传递给AddEditTaskFragment的参数,并希望将修改后的参数发送回TodayFragment。由于每次导航到 TodayFragment 时都会调用 onViewCreated(),因此我想检查我是否真的将参数传递给它以将任务保存在我的数据库中。
由于 AddEditTaskFragmentArgs.fromBundle(getArguments()) != null 不起作用,因此检查片段是否正在接收参数的推荐方法是什么?
这就是我导航回调用片段的方式。
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 导航资源文件中,需要在每个目标片段中声明参数(在您的情况下,它似乎是两个片段,因为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>
在源片段中,您可以使用 setter 设置参数(就像您所做的那样)或直接在操作构造函数中传递它们(这取决于参数类型以及您是否为它们指定了默认值)。更多信息可以在官方文档中找到。
由于我注意到您没有向构造函数提供任何参数,因此我的猜测是您为所有参数提供了默认值。
然后,在目标片段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()
。如果传递给片段的 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 ...
}
希望对:)有所帮助