Вопрос по android, android-fragments – Какой смысл setArguments?

40

Привет, я смотрел на следующий пример фрагментов на сайте Android.

http://developer.android.com/guide/components/fragments.html#Example

Я хотел бы знать, почему определенные методы выполняются.

Почему, например, вdetailsFragment выполняется следующий метод:

public static DetailsFragment newInstance(int index) {
    DetailsFragment f = new DetailsFragment();

    // Supply index input as an argument.
    Bundle args = new Bundle();
    args.putInt("index", index);
    f.setArguments(args);

    return f;
}

Не могли бы вы также просто создать экземплярDetailsFragment и использовать метод установки, чтобы установитьindex вместо. В обход всегоsetArguments.

Какой смысл использоватьsetArguments на первом месте? Не могли бы вы просто использовать сеттеры и геттеры?

Посмотрите на это:stackoverflow.com/a/7160253/334493 Benoit Duffez
возможный дубликатMember variables vs setArguments in Fragments tir38
@ Каракури, спасибо, это полезно знать. HGPB
В последнее время стало обычным делом инкапсулировать основные функциональные возможности приложения вFragments, а затем иметьActivities по существу управляют расположением (и навигацией между) экранами, составленными из упомянутых фрагментов. СActivityВы могли бы передатьBundle дополнений в намерении и имеют доступ к этому сразу, начиная сonCreate(). Fragments не отвечайте на намерения, поэтому вместо этого вы можете использоватьsetArguments() поставить егоBundle & quot; из дополнений & quot; прежде чем он будет создан. Karakuri

Ваш Ответ

4   ответа
6
public void setArguments (Bundle args)

called before the fragment has been attached to its activity; that is, you should call it immediately after constructing the fragment. The arguments supplied here will be retained across fragment destroy and creation (may be the text in bold was missing from official documentation previously)

Fragments.setArguments (набор аргументов)

Спасибо. Вы подтвердили эту критическую точку, предоставив соответствующую документацию.
38

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

По сути, setArguments и getArguments - это просто шаблон проектирования, который Google предлагает вам выполнить:

Every fragment must have an empty constructor, so it can be instantiated when restoring its activity's state. It is strongly recommended that subclasses do not have other constructors with parameters, since these constructors will not be called when the fragment is re-instantiated; instead, arguments can be supplied by the caller with setArguments(Bundle) and later retrieved by the Fragment with getArguments(). http://developer.android.com/reference/android/app/Fragment.html

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

Как насчет двух конструкторов; один пустой и тот, который принимает начальное состояние фрагмента. Затем фрагмент может использовать пакет, переданный в onSaveInstanceState () и onCreate (), чтобы сохранить состояние экземпляра?
Вы упускаете момент о жизненном цикле фрагмента. Смотрите ответ @ JohnnyLambada.
Хорошие вещи, просто два разных способа сделать одну и ту же работу - отлично. Ваше второе замечание делает использование setArguments более ценным, чем просто использование сеттеров и геттеров, если это правда. В этом случае я не уверен, что это будет иметь какое-либо значение. Но я могу ошибаться. HGPB
Гленн, как правило, у меня есть статический метод getInstance (..), который создает пакет со всеми аргументами и использует setArguments () для нового экземпляра фрагмента. Таким образом, у вас есть простой & quot; конструктор & quot; чтобы вызвать, аргументы установлены, и у Android есть хороший пустой конструктор, который он может использовать внутри.
23

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

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

Это должно быть сделано черезFragment.onSaveInstanceState(), Сохраненные данные будут переданы вам в качестве параметраsavedInstanceState вFragment.onCreate(), Fragment.onCreateView() и несколько других методов.

С помощьюFragment.setArguments() Это (в большинстве случаев, я полагаю) проще, в рамках автоматически сохранит аргументы и, таким образом, сделает большую часть работы за вас.

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

@rmirabelle Недостаточная документация, к сожалению, мне подходит для многих случаев в Android. Я обнаружил множество случаев, которые невозможны или проблематичны, и которые либо не документированы вообще, либо только как побочный узел где-то, либо где где-то в ответе группы stackoverflow / google.
Это критически важный аспект понимания фрагментов, который, как мне кажется, может быть нелепо недокументирован. Ваш ответ дает некоторое представление. Если вы не хотите использовать setArguments и вместо этого хотите использовать установщик, тогда вы ДОЛЖНЫ использовать onSaveInstanceState, или Android не сможет повторно инициализировать ваш фрагмент? Jeez!
0

сеттеры могут быть использованы неправильно. Если updateSomeOtherStuff () изменит некоторые представления, это приведет к сбою.

public class MyFragment extends Fragment {
   void setData(someData){
       this.someData = someData;
       updateSomeOtherStuff()
   }
}

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

Похожие вопросы