FragmentStatePagerAdapter, тот же фрагмент, другой макет

В других темах, таких как: Как реализовать ViewPager с разными фрагментами/ Макеты — это разные фрагменты и разные макеты, каждый из которых выбирается в методе getItem.

У меня много разных макетов (но все похожи) и я повторно использовал один и тот же фрагмент. В моем фрагменте у меня есть это:

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
        Bundle savedInstanceState) 
{
    int pageLayout;
    switch (mPageNumber)
    {
    case 0:
        pageLayout = R.layout.fragment_screen_slide_page2;
        break;
    default:
        pageLayout = R.layout.fragment_screen_slide_page;
    }
    // Inflate the layout containing a title and body text.
    ViewGroup rootView = (ViewGroup) inflater
            .inflate(pageLayout, 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;
}
/**
 * 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;
}

Это работает, что-то не так с этим подходом вместо классического подхода, который создает фрагмент для каждого макета?


person Accollativo    schedule 13.03.2016    source источник
comment
Я думаю, это зависит от того, как вы планируете их использовать, но я думаю, что это законно.   -  person Vucko    schedule 14.03.2016


Ответы (1)


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

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

person aashreys    schedule 13.03.2016
comment
Вы имеете в виду, что в моем методе создания я должен добавить int (для хранения R.layout.fragment_screen_slide_page2 и других макетов) и я должен переместить переключатель в адаптере? - person Accollativo; 14.03.2016
comment
По сути, вместо «создать (int pageNumber)» используйте «создать (int layoutRes)», а затем получите доступ к «layoutRes» из ваших аргументов и передайте его в компоновщик макета во фрагменте. - person aashreys; 14.03.2016
comment
Поэтому я должен оставить весь код таким образом, кроме «create (int layoutRes)». Правильно ли создавать каждый раз новый фрагмент с другим идентификатором? Или я могу реализовать синглтон и изменить макет? (просто для вопроса, эта идея тоже звучит плохо для меня). - person Accollativo; 15.03.2016
comment
Что ж, я бы рекомендовал не использовать синглтоны, поскольку по большей части вам придется управлять состоянием фрагмента вручную. Фрагменты были разработаны как модульные легкие компоненты пользовательского интерфейса, поэтому используйте их именно так. Что касается разрешения макета, которое вы передаете своему фрагменту, просто используйте его в компоновщике макета, чтобы раздуть нужный пользовательский интерфейс, и пусть фрагмент обрабатывает свой жизненный цикл как обычно. Если вы меняете только макет, а макеты абсолютно совместимы (похожая структура, идентификаторы просмотра, функции и т. д.), то фрагмент должен иметь возможность управлять своим жизненным циклом без вашего вмешательства. - person aashreys; 16.03.2016