Проверьте, существуют ли аргументы при переходе к фрагменту с использованием 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 ...
}

Надеюсь, это поможет:)

Другие вопросы по тегам