Я обнаружил, что это ОЧЕНЬ запутанная проблема (одна из многих, которые засоряют ландшафт Android).
setArguments()
— это обходной путь для очень бесполезной потребности Android иметь конструктор без параметров, доступный для фрагментов.
Мое замешательство пришло волнами. Во-первых, методы, которые вы естественным образом переопределяете в своем Fragment
(например, onCreate
, onCreateView
), получают параметр Bundle
, который представляет savedInstanceState
вашего Fragment
. Это состояние экземпляра, по-видимому, не имеет НИЧЕГО общего со значениями, которые вы сохраняете через setArguments()
и извлекаете через getArguments()
. Оба используют Bundle
, оба Bundles
, скорее всего, будут доступны в рамках одного и того же переопределенного метода, и ни один из них не имеет ничего общего друг с другом.
Во-вторых, непонятно, как Android использует setArguments()
. Android вызывает ваш конструктор без параметров для перестроения вашего Fragment
при повороте, но, по-видимому, ТАКЖЕ вызовет тот метод setArguments()
, который последний раз вызывался при создании Fragment
.
Хм????
Удивительно, но правда. Все это создание Bundles
с setArguments()
безумием существует, чтобы компенсировать потребность в конструкторе Fragment
без параметров.
Короче говоря, я использую статический метод newInstance
для создания своего Fragment
.
public MyFragment() {
//satisfy Android
}
public static MyFragment newInstance(long record_id) {
Log.d("MyFragment", "Putting " + record_id + " into newInstance");
MyFragment f = new MyFragment();
Bundle args = new Bundle();
args.putLong("record_id", record_id);
f.setArguments(args);
return f;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/**
* Perform an immediate check of arguments,
* which ARE NOT the same as the bundle used
* for saved instance state.
*/
Bundle args = getArguments();
if(args != null) {
record_id = args.getLong("record_id");
Log.d("MyFragment", "found record_id of " + String.valueOf(record_id));
}
if(savedInstanceState != null) {
//now do something with savedInstanceState
}
}
person
rmirabelle
schedule
01.07.2013