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

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

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

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

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

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

Ответы [ 3 ]

22 голосов
/ 26 августа 2014

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

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

14 голосов
/ 08 марта 2012

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

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

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

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

2 голосов
/ 08 марта 2012

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

Нет.


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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...