Какой смысл setArguments?
Привет, я смотрел следующий пример фрагментов на сайте 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
и использовать метод setter для установки index
. Обход всего setArguments
.
В чем смысл использования setArguments
в первую очередь? Не могли бы вы просто использовать сеттеры и геттеры?
Ответы
Ответ 1
Вы можете использовать геттеры и сеттеры, но, передавая в комплекте, вам не нужно писать этот код, так как он уже существует. Кроме того, я считаю, что эти аргументы автоматически передаются снова, если меняется ориентация экрана, что также облегчает жизнь.
По существу, setArguments и getArguments - это всего лишь шаблон дизайна, который Google предлагает вам:
Каждый фрагмент должен иметь пустой конструктор, поэтому он может быть созданный при восстановлении его состояния активности. Это сильно рекомендовал, чтобы в подклассах не было других конструкторов с параметров, так как эти конструкторы не будут вызываться, когда фрагмент повторно создается; вместо этого аргументы могут быть предоставлены вызывающий с setArguments (Bundle), а затем полученный фрагментом с getArguments(). http://developer.android.com/reference/android/app/Fragment.html
Я считаю, что включать сеттеры, которые необходимы для работы вашего Фрагмента. Опять же - нет ничего, что заставило бы вас сделать это таким образом, и, как вы знаете, это не единственный способ заставить работать.
Ответ 2
Просто добавьте ответ Мэтью: он правильно цитировал, что Фрагменты должны иметь пустой конструктор, так что структура может повторно создавать их, когда это необходимо.
Хорошо использовать геттеры и сеттеры, но поскольку инфраструктура может уничтожить и воссоздать ваш фрагмент, вы должны не потерять эти параметры.
Это нужно сделать через Fragment.onSaveInstanceState()
. Сохраненные данные будут переданы вам как параметр savedInstanceState
в Fragment.onCreate()
, Fragment.onCreateView()
и несколько других методов.
Использование Fragment.setArguments()
(в большинстве случаев, я полагаю) проще, в рамках структуры автоматически сохраняются аргументы и, таким образом, будут выполнять большую часть работы для вас.
Сетчаты могут быть способом поиска параметров, которые вы первоначально поставляете в Фрагмент и которые фрагмент может корректировать со временем. В этом случае справиться с самим savedInstanceState может быть проще, чем иметь дело с savedInstanceState и аргументами - там, где вы должны принять решение, которое является допустимым параметром.
Ответ 3
public void setArguments (Bundle args)
Поставьте аргументы конструкции для этого фрагмента. Это может быть только до того, как фрагмент был присоединен к его активности; то есть, вы должны вызвать его сразу после создания фрагмента. The аргументы, предоставленные здесь, будут сохранены через уничтожение фрагмента и создание (может быть, текст, выделенный полужирным шрифтом, отсутствует у официального документация ранее)
Fragments.setArguments(Bundle args)
Ответ 4
Кроме того, сеттеры могут быть использованы неправильно. Если updateSomeOtherStuff() изменит некоторые представления, это приведет к сбою.
public class MyFragment extends Fragment {
void setData(someData){
this.someData = someData;
updateSomeOtherStuff()
}
}
Если кто-то проходит в комплекте, невозможно использовать злоумышленник, и вы всегда будете знать, что это будет установлено в методах жизненного цикла.