Активность Android ViewPager

После обширных исследований по этой теме я зашел в тупик. Я пытаюсь реализовать ViewPager из Android Использование ViewPager для слайдов экрана ', чтобы на каждой странице был разный текст, как если бы вы пролистывали страницы в книге. Как он настроен, у них есть два файла XML (один, который реализует элемент ViewPager в классе активности фрагмента, другой имеет текстовое представление в классе фрагмента), которые показывают Lorem Ipsum на каждой отдельной странице. Я пытаюсь найти способ изменить текстовое представление в классе Fragment, чтобы при переходе на страницы 2, 3, 4 и т. Д. На каждой странице был разный текст.

В классе ScreenSlideActivity я пробовал использовать переключатель внутри внутреннего обработчика событий onPageScrollStateChanged(int position), устанавливая определенные текстовые представления на видимые / невидимые. Я также пробовал использовать переключатель внутри класса ScreenSlidePageFragment в методе onCreateView (LayoutInflater inflater, контейнер ViewGroup, Bundle savedInstanceState). Это правильный подход или я ошибаюсь? Я определенно что-то упускаю из виду, не могли бы вы указать мне правильное направление?

Это сборка, ориентированная на API-интерфейсы с 14 по 17, с использованием Eclipse. Ниже вы можете найти код из двух классов, а также XML-файл с текстовым представлением:

// Класс активности фрагмента //

public class ScreenSlideActivity extends FragmentActivity {
/**
 * The number of pages (wizard steps) to show in this demo.
 */
private static final int NUM_PAGES = 5;

/**
 * The pager widget, which handles animation and allows swiping horizontally to access previous
 * and next wizard steps.
 */
private ViewPager mPager;

/**
 * The pager adapter, which provides the pages to the view pager widget.
 */
private PagerAdapter mPagerAdapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_screen_slide);
    getActionBar().setDisplayHomeAsUpEnabled(true);

 // Instantiate a ViewPager and a PagerAdapter.
    mPager = (ViewPager) findViewById(R.id.pager);
    mPagerAdapter = new ScreenSlidePagerAdapter(getFragmentManager());
    mPager.setAdapter(mPagerAdapter);
    mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            // When changing pages, reset the action bar actions since they are dependent
            // on which page is currently active. An alternative approach is to have each
            // fragment expose actions itself (rather than the activity exposing actions),
            // but for simplicity, the activity provides the actions in this sample.

            invalidateOptionsMenu();
        }
    });
}

private class ScreenSlidePagerAdapter extends FragmentStatePagerAdapter {
    public ScreenSlidePagerAdapter(FragmentManager fm) {
        super(fm);
    }

    @Override
    public Fragment getItem(int position) {

        return ScreenSlidePageFragment.create(position);
    }

    @Override
    public int getCount() {
        return NUM_PAGES;
    }
}

// Класс фрагмента //

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) {

    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;
}

}

// Макет XML //

<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/content"
android:layout_width="match_parent"
android:layout_height="match_parent">

<!-- Dummy content. -->
<LinearLayout android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical"
    android:padding="16dp">

    <TextView android:id="@android:id/text1"
        style="?android:textAppearanceLarge"
        android:textStyle="bold"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginBottom="16dp" />

    <TextView
        android:id="@+id/lorem_ipsum1"
        style="?android:textAppearanceMedium"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:lineSpacingMultiplier="1.2"
        android:text="@string/lorem_ipsum" />

</LinearLayout>


person FugueWeb    schedule 10.09.2013    source источник
comment
Чего вы пытаетесь достичь с помощью этого кода ... setText(getString(R.string.title_template_step, mPageNumber + 1))? Двухпараметрический метод для getString(...) требует Object, который определяет аргументы формата.   -  person Squonk    schedule 10.09.2013
comment
В TextView в верхней части макета есть заголовок, в котором указано имя документа (Lorem Ipsum), как определено в strings.xml, а + 1 увеличивает номер страницы (Lorem Ipsum, страница 1, Lorem Ipsum, страница 2, так далее.)   -  person FugueWeb    schedule 10.09.2013


Ответы (1)


Проблема решена, мне пришлось создать оператор switch внутри ScreenSlidePageFragment, отключив / включив видимость (VISIBILE или GONE) в зависимости от переменной mPageNumber (т.е. номер страницы определял строковое значение, установленное для этой страницы). Это халтура, неэффективность или просто нормально? Итог, это работает. Все строки сохраняются в strings.xml. Опять же, не уверен, что это хорошая практика для больших струн.

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

    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));

    switch(mPageNumber){
        case 0:
            rootView.findViewById(R.id.lorem_ipsum1).setVisibility(View.VISIBLE);
            rootView.findViewById(R.id.lorem_ipsum2).setVisibility(View.GONE);
            rootView.findViewById(R.id.lorem_ipsum3).setVisibility(View.GONE);
            break;
        case 1:
            rootView.findViewById(R.id.lorem_ipsum1).setVisibility(View.GONE);
            rootView.findViewById(R.id.lorem_ipsum2).setVisibility(View.VISIBLE);
            rootView.findViewById(R.id.lorem_ipsum3).setVisibility(View.GONE);
            break;
        case 2:
          rootView.findViewById(R.id.lorem_ipsum1).setVisibility(View.GONE);
          rootView.findViewById(R.id.lorem_ipsum2).setVisibility(View.GONE);
          rootView.findViewById(R.id.lorem_ipsum3).setVisibility(View.VISIBLE);
          break;
        }

    return rootView;
}
person FugueWeb    schedule 22.09.2013