[英]How to add shared element transition when navigating from recycler view to a fragment while using navigation components and safeArgs?
[英]Check if arguments exists when navigating to Fragment using SafeArgs
我遷移到導航組件,因為我現在使用 Fragment,所以我不再在 Fragment 中調用 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 ...
}
希望有幫助:)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.