Поиск по этому блогу

среда, 18 сентября 2013 г.

ViewPager с тремя разными Activity

Сегодня я хочу рассказать как сделать свайп активностями через такую прекрасную вещь как ViewPager. В интернете полно разных статей на эту тему, но не одна не затрагивает как сделать так что бы например у вас есть три активности и их нужно вывести отдельно но при этом что бы их можно было листать как книжку вправо влево. Это все довольно просто получается, достаточно использовать фрагменты и класс FragmentActivity и все становится красиво и просто, и так давайте начнем.



Прежде всего нам нужно создать проект, а дальше в созданном новом классе MainActiivity сносим все к чертям до имени класса и вставляем следующий код:

MainActivity.java
public class MainActivity extends FragmentActivity {

    /** идентификатор первого фрагмента. */
    public static final int FRAGMENT_ONE = 0;
    /** идентификатор третего. */
    public static final int FRAGMENT_THREE = 2;
    /** идентификатор второго. */
    public static final int FRAGMENT_TWO = 1;
    /** количество фрагментов. */
    public static final int FRAGMENTS = 3;
    /** адаптер фрагментов. */
    private FragmentPagerAdapter _fragmentPagerAdapter;
    /** список фрагментов для отображения. */
    private final List<Fragment> _fragments = new ArrayList<Fragment>();
    /** сам ViewPager который будет все это отображать. */
    private ViewPager _viewPager;

    @Override
    protected void onCreate(final Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // создаем фрагменты.
        _fragments.add(FRAGMENT_ONE, new FirstFragment());
        _fragments.add(FRAGMENT_TWO, new SecondFragment());
        _fragments.add(FRAGMENT_THREE, new TherdFragment());
        // Настройка фрагментов, определяющих количество фрагментов, экраны и название.
        _fragmentPagerAdapter = new FragmentPagerAdapter(getSupportFragmentManager()) {

            @Override
            public int getCount() {

                return FRAGMENTS;
            }

            @Override
            public Fragment getItem(final int position) {

                return _fragments.get(position);
            }

            @Override
            public CharSequence getPageTitle(final int position) {

                switch (position) {
                    case FRAGMENT_ONE:
                        return "Title One";
                    case FRAGMENT_TWO:
                        return "Title Two";
                    case FRAGMENT_THREE:
                        return "Title three";
                    default:
                        return null;
                }
            }
        };
        _viewPager = (ViewPager) findViewById(R.id.pager);
        _viewPager.setAdapter(_fragmentPagerAdapter);
        _viewPager.setCurrentItem(1);
    }
}


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

activity_main.xml
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity" >

    <android.support.v4.view.ViewPager
        android:id="@+id/pager"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
    />

</RelativeLayout>


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

FirstFragment.java
public class FirstFragment extends Fragment {

    private Context context;

    /** Handle the results from the voice recognition activity. */
    @Override
    public void onActivityCreated(Bundle savedInstanceState) {

        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
                //задаем разметку фрагменту
        final View view = inflater.inflate(R.layout.first, container, false);
                //ну и контекст, так как фрагменты не содержат собственного
        context = view.getContext();
                //выводим текст который хотим
        TextView wordsCount = (TextView) view.findViewById(R.id.textView1);
        wordsCount.setText("FirstActivity");
        return view;
    }
}


По сути дела тут все просто, каждый фрагмент выполняет отдельную функцию и ничего ни кому не мешает, все элементарно и просто. Далее вам предстоит создать еще два класса SecondFragment и ThrdFgment в которых будет тоже самое что и в FirstFragment, ах да я забыл разметку:

frst.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="TextView"
        android:textSize="40sp" />

</LinearLayout>


Простой TextView без выпендресов (: Объяснить старался как можно проще, комментарии в коде должны донести мою мысль, хоть их там и не много но я думаю достаточно, потому что я описал там самые главные моменты, остальное не столь важно. 

Скачать исходники с: GitHub | DropBox