Android: ViewPagerIndicator — создание разных макетов для разных страниц

Мне нужно создать четыре разных макета, каждый на странице ViewPagerIndicator. Как я могу это сделать? Индикатор ViewPagerIndicator уже работает, но я использую образец с http://viewpagerindicator.com, и там создан простой TextView для всех страниц.

См. образец (TestFragment.java):

  @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

    TextView text = new TextView(getActivity());
    text.setGravity(Gravity.CENTER);
    text.setText(mContent);
    text.setTextSize(20 * getResources().getDisplayMetrics().density);
    text.setPadding(20, 20, 20, 20);

    LinearLayout layout = new LinearLayout(getActivity());
    layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
    layout.setGravity(Gravity.CENTER);
    layout.addView(text);

    return layout;
}

Мне нужно определить текущую страницу (позицию) и обратиться к соответствующему макету ресурса (XML). Является ли это возможным?

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

Я ценю любую помощь! Спасибо


person Daniel    schedule 22.05.2012    source источник


Ответы (1)


Я нашел простое решение, которое работает для меня. Вот что я сделал.

TestFragment.class

      public static TestFragment newInstance(String content) {
        TestFragment fragment = new TestFragment();
//
//        StringBuilder builder = new StringBuilder();
//        for (int i = 0; i < 20; i++) {
//            builder.append(content).append(" ");
//        }
//        builder.deleteCharAt(builder.length() - 1);
        fragment.mContent = content;

        return fragment;
    }

Закомментируйте цикл for здесь. Просто получите mContent, который мы собираемся использовать в качестве флага.

Теперь в вашем onCreateView() измените его следующим образом:

   @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
//        TextView text = new TextView(getActivity());
//        text.setGravity(Gravity.CENTER);
//        text.setText(mContent);
//        text.setTextSize(20 * getResources().getDisplayMetrics().density);
//        text.setPadding(20, 20, 20, 20);
//
//        LinearLayout layout = new LinearLayout(getActivity());
//        layout.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
//        layout.setGravity(Gravity.CENTER);
//        layout.addView(text);
        Log.i("mContent",mContent);
        View view=null;
        if(mContent.equalsIgnoreCase("title1"))
        {
            view = inflater.inflate(R.layout.one, container, false);

        }
        else if(mContent.equalsIgnoreCase("title2"))
        {
            view = inflater.inflate(R.layout.two, container, false);
        }
        else if(mContent.equalsIgnoreCase("title3"))
        {
            view = inflater.inflate(R.layout.three, container, false);
        }
        return view;

    }

Это все, что нужно. Теперь вы сможете увеличить количество просмотров на основе названия заголовка, которое мы использовали в качестве флага.

person Andro Selva    schedule 22.05.2012
comment
Да! Это оно! Это сработало для меня. Единственное, что я изменил в вашем коде, это то, что мне нужно работать с позицией страницы, а не с заголовком, потому что приложение многоязычное. В классе, расширяющем адаптер фрагментов, я изменился на: public Fragment getItem(int position) { return baseFragment.newInstance(String.valueOf(position));} - person Daniel; 22.05.2012
comment
Да. Это обряд. Я понимал, что это не очень хорошая практика, но поскольку вопрос был задан несколько часов назад, мне пришлось искать быстрое решение. Я рад, что это работает для вас. - person Andro Selva; 22.05.2012
comment
Кажется, когда я, например, нахожусь на странице 4, содержимое страниц 1 и 2 перезагружается, и я теряю некоторую информацию. Вы знаете какой-нибудь способ избежать этого? - person Daniel; 22.05.2012
comment
Какую информацию вы теряете? Я просто сделал образец на его основе. Я не знаю об этом на самом деле. - person Andro Selva; 22.05.2012
comment
Я сделал тест, я поместил кнопку на страницу 2, при нажатии она меняет собственный текст на другой текст... Итак, я прокручиваю страницу 4, а когда возвращаюсь на страницу 2, текст кнопки является исходным :( . .. Лучше бы все страницы загружались сразу. - person Daniel; 22.05.2012
comment
на самом деле код работает так: каждый раз, когда вы делаете прокрутку, представление становится нулевым и рисует новое представление. Итак, что вам нужно сделать, это объявить необходимое количество просмотров (скажем, 5 просмотров, если у вас есть 5 фрагментов). И теперь в onCreateView проверьте наличие null, и если null заполните свое представление, иначе просто отобразите то представление, которое вы объявили глобально. должен решить проблему,. - person Andro Selva; 22.05.2012
comment
Я понимаю, но глядя на документацию [developer.android.com/reference/android/support/v4/view/ ... Я нашел более простое решение, позволяющее делать то, что мне нужно. mPager.setOffscreenPageLimit(5); По умолчанию 1 (соседние - я думаю). Еще раз спасибо! - person Daniel; 22.05.2012
comment
Настоящая проблема с этим решением — перезагрузка при переходе между страницами. - person Idan Gozlan; 29.01.2013
comment
ваш код работает хорошо. @AndroSelva, не могли бы вы ответить stackoverflow .com/questions/22961427/. я застрял здесь с дней - person Manwal; 09.04.2014