Android ViewPager активность
После некоторых обширных исследований по этой теме я зашел в тупик. Я пытаюсь реализовать ViewPager
из учебника Android " Использование ViewPager для слайдов экрана", чтобы иметь разный текст на каждой странице, как будто вы листаете страницы в книге. Как это настроено, у них есть два XML-файла (один, который реализует элемент ViewPager в классе Fragment Activity, другой, имеющий текстовое представление в классе Fragment), который показывает Lorem Ipsum на каждой отдельной странице. Я пытаюсь найти способ изменить текстовое представление в классе Fragment, чтобы при переходе на страницу 2, 3, 4 и т. Д. На каждой странице был разный текст.
в ScreenSlideActivity
класс, я пытался использовать переключатель внутри onPageScrollStateChanged(int position)
внутренний обработчик событий, устанавливающий определенные текстовые представления на видимый / невидимый. Я также пытался использовать переключатель внутри класса ScreenSlidePageFragment в методе onCreateView(LayoutInflater inflater, контейнер ViewGroup, Bundle saveInstanceState). Это правильный подход или я ухожу? Я определенно что-то упускаю из виду, может, кто-нибудь укажет мне правильное направление?
Это API-интерфейсы с таргетингом на сборки с 14 по 17, использующие Eclipse. Ниже приведен код из двух классов, а также файл XML с textview:
// Фрагмент класса деятельности //
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>
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;
}