В примерах Android, почему класс ScreenSlidePageFragment использует фабричный метод для создания объекта
Я понятия не имею, почему они использовали фабричный метод для создания экземпляров ScreenSlidePageFragment. что не так с передачей pageNumber в конструктор и назначением его mPageNumber там, и, конечно, избавлением от этого фабричного метода и ARG_PAGE?! Вот код:
public class ScreenSlidePageFragment extends Fragment {
/**
* The argument key for the page number this fragment represents.
*/
public static final String ARG_PAGE = "page";
/**
* The fragment's page number, which is set to the argument value for {@link #ARG_PAGE}.
*/
private int mPageNumber;
/**
* Factory method for this fragment class. Constructs a new fragment for the given page number.
*/
public static ScreenSlidePageFragment create(int pageNumber) {
ScreenSlidePageFragment fragment = new ScreenSlidePageFragment();
Bundle args = new Bundle();
args.putInt(ARG_PAGE, pageNumber);
fragment.setArguments(args);
return fragment;
}
public ScreenSlidePageFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mPageNumber = getArguments().getInt(ARG_PAGE);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout containing a title and body text.
ViewGroup rootView = (ViewGroup) inflater
.inflate(R.layout.fragment_screen_slide_page, container, false);
// Set the title view to show the page number.
((TextView) rootView.findViewById(android.R.id.text1)).setText(
getString(R.string.title_template_step, mPageNumber + 1));
return rootView;
}
/**
* Returns the page number represented by this fragment object.
*/
public int getPageNumber() {
return mPageNumber;
}
}
1 ответ
Что не так с тем, что вы предлагаете, так это то, что данные будут потеряны при изменении конфигурации. Аргументы Bundle
автоматически является частью сохраненного состояния экземпляра фрагмента, поэтому данные автоматически сохраняются при изменении конфигурации. В противном случае по умолчанию вы потеряете номер своей страницы, когда пользователь поворачивает экран или вносит какие-либо другие изменения в конфигурацию.
Есть и другие способы решения проблемы (например, укажите номер страницы в onSavedInstanceState()
Bundle
сам). Фабричный метод и аргументы Bundle
это просто и эффективный способ решения проблемы, но это не единственный способ.