Проверьте, существуют ли аргументы при переходе к фрагменту с использованием SafeArgs
Я мигрировал в Компоненты навигации и, поскольку теперь я использую Фрагменты, я больше не вызываю onActivityResult() в своем Фрагменте.
Я определил аргументы, которые я передаю в AddEditTaskFragment, и хочу отправить измененные аргументы обратно в TodayFragment. Так как onViewCreated() вызывается каждый раз, когда я перехожу к фрагменту TodayFragment, я хочу проверить, действительно ли я передаю ему аргументы для сохранения Задачи в моей БД.
Поскольку 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();
}
0 ответов
Не знаю, догадались ли вы с тех пор, но вот как у меня дела.
В вашем файле ресурсов навигации 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>
В исходном фрагменте вы можете установить аргументы с помощью сеттеров (как вы это делали) или передать их непосредственно в конструктор действия (это зависит от типов аргументов, а также от того, если вы указали для них значение по умолчанию). Более подробную информацию можно найти в официальной документации.
Поскольку я заметил, что вы не предоставили никакого аргумента своему конструктору, я предполагаю, что вы предоставили значения по умолчанию для всех своих аргументов.
Затем в вашем целевом фрагменте 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 ...
}
Надеюсь, это поможет:)