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

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

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

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

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

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

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

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

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

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

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

Да, если вы вызвали 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); 

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

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

Нет.


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

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

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