Подтвердить что ты не робот

Можно ли передавать аргументы фрагменту после его добавления в действие?

Я знаю, что когда вы сначала создаете экземпляр фрагмента, вы можете передавать аргументы с помощью setArguments(Bundle) и извлекать их в фрагменте с помощью getArguments().

Однако в моем приложении у меня есть фрагменты, которые будут отсоединены и присоединены несколько раз после того, как они будут добавлены в действие. При повторном подключении мне может потребоваться передать фрагмент аргументу для изменения его содержимого до его повторного подключения. Я могу использовать setArguments при первом отображении фрагмента, но в последующих случаях это не сработает. savedInstanceState не будет работать в этом случае, так как я не буду знать значения аргумента перед отсоединением фрагмента.

Я знаю, что могу просто реализовать метод, который я бы назвал, прежде чем присоединить фрагмент, который установил бы аргумент, но похоже, что это уже может быть в API, и я просто не вижу его.

Есть ли что-то встроенное, что позволит мне это сделать, или мне придется реализовать это самостоятельно? Для записи я использую пакет поддержки (v4).

Большое спасибо!

4b9b3361

Ответ 1

Вы можете просто выставить метод на вашем фрагменте, который устанавливает все, что вы хотите передать ему. Чтобы вызвать это, вы можете, например, получить фрагмент из backstack по тегу или сохранить ссылку на экземпляр вокруг, откуда вы его вызываете.

Это работает хорошо для меня, хотя вам нужно быть защищенным с точки зрения нулевых проверок и, так же как знать о жизненном пути, который ваш фрагмент проходит, когда вы его присоединяете или перезапускаете.

Из того, что я могу сказать, в API нет ничего...

Обновление: это по-прежнему верно и работает отлично. Я обнаружил, что, когда это более сложно, гораздо проще и проще использовать что-то вроде Otto eventbus. Очень рекомендуется imho.

Ответ 2

Да, если вы вызвали setArguments (bundle) до того, как ваш фрагмент станет активным. Затем у вашего фрагмента есть пакет, который вы можете обновить. Чтобы избежать вашей проблемы, вы должны обновить исходный пакет и не должны вызывать setArguments второй раз. Итак, следуя за вашей начальной конструкцией фрагмента, измените аргументы фрагмента с кодом типа

frg.getArguments().putString("someKey", "someValue");

Затем аргументы будут доступны в вашем фрагменте и будут сохраняться и восстанавливаться во время изменений ориентации и т.д.

Обратите внимание, что этот метод также полезен, когда фрагмент создается через xml в макете. Как правило, невозможно было бы аргументировать этот фрагмент; способ избежать этого ограничения заключается в создании конструктора без аргументов, который создает набор аргументов следующим образом:

public MyFragment() {
    this.setArguments(new Bundle());
}

Позже где-нибудь в вашей работе метод onCreate вы бы сделали:

FragmentManager mgr = this.getSupportFragmentManager();
Fragment frg = mgr.findFragmentById(R.id.gl_frgMyFragment);
Bundle bdl = frg.getArguments();
bdl.putSerializable(MyFragment.ATTR_SOMEATTR, someData);

Это помещает данные в набор аргументов, который затем будет доступен для кода в вашем фрагменте.

Ответ 3

Можно ли передать аргументы фрагменту после его добавления в действие?

Нет.


Но если вы ищете способы общения с деятельностью, к которой привязан фрагмент, вы можете сделать это так, как упомянул @manfred, или другие способы, описанные в Документация

Есть еще один интересный способ обмениваться двумя фрагментами друг с другом. То есть с помощью методов setTargetFragment и getTargetFragment. Здесь If fragmentB может повлиять на fragmentA, вы setTargetFragment от fragmentB до fragmentA, и когда изменения должны быть обновлены до fragmentA изнутри fragmentB, вы получите ссылку на него от ((fragmentA) getTargetFragment()) и получить доступ к методу fragmentA, чтобы обновить его.

Надеюсь, это поможет. Удачи.