Прежде всего, я уже знаю, что FragmentManager часто уничтожает, а затем повторно создает Фрагмент, используя конструктор по умолчанию. Кодеры должны сохранять важные вещи в Bundle аргументов один раз в методе factory, а затем вынимать их каждый раз, когда фрагмент воссоздается в onCreate (Bundle).
public class MyFragment extends Fragment {
private static final String MY_STRING_CONSTANT = "param";
private int mIntegerMember;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mIntegerMember= getArguments().getInt(MY_STRING_CONSTANT);
}
}
Мой вопрос в том, есть ли разница между этим:
// Inside MyFragment.java
public MyFragment() {
// No-argument constructor required by the FragmentManager.
}
public static MyFragment newInstance(int param) {
// Factory method
MyFragment fragment = new MyFragment();
Bundle args = new Bundle();
args.putInt(MY_STRING_CONSTANT, param);
fragment.setArguments(args);
return fragment;
}
// Somewhere else
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.frame_layout, MyFragment.newInstance(123)).commit();
И это:
// Inside MyFragment.java
public MyFragment() {
// No-argument constructor required by the FragmentManager.
}
public MyFragment(int param) {
// Parameterized constructor
Bundle args = new Bundle();
args.putInt(MY_STRING_CONSTANT, param);
setArguments(args);
}
// Somewhere else
FragmentTransaction transaction = getFragmentManager().beginTransaction();
transaction.add(R.id.frame_layout, new MyFragment(123)).commit();
Я не вижу ничего, что мешает FragmentManager вызывать конструктор без аргументов. И данные, которые я сохраняю в параметризованном конструкторе (в объекте Bundle), будут сохраняться и восстанавливаться во время onCreate(), как если бы я использовал метод factory.