Просмотр пейджера с фрагментами и индикатором

Я разрабатываю приложение, в котором я реализовал ViewPager, я хочу, чтобы пользователь провёл и получил следующий экран. Я реализую фрагменты. Все хорошо, но я хочу еще одну вещь. Я хочу указать, какой экран активен сейчас. Как вкладки. Я искал через Интернет, но не нашел ничего полезного. Если есть идея, которая будет объявлена. Благодарю. Вот мой адаптер пейджера и активность фрагмента и макет xml

import java.util.ArrayList; import java.util.List; import com.viewpagerindicator.TitlePageIndicator; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.view.ViewPager; import android.support.v4.view.ViewPager.OnPageChangeListener; import android.widget.Toast; public class MainActivity extends FragmentActivity implements OnPageChangeListener { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); List<Fragment> list = new ArrayList<Fragment>(); list.add(MyFragment.newInstance("fragment 1")); list.add(MyFragment.newInstance("fragment 2")); list.add(MyFragment.newInstance("fragment 3")); MyPagerAdapter a = new MyPagerAdapter(getSupportFragmentManager(), list); ViewPager pager = (ViewPager) findViewById(R.id.viewpager); pager.setAdapter(a); } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub } } 

adapter.java

 package com.example.fragments; import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentPagerAdapter; import android.support.v4.view.PagerAdapter; import android.view.View; public class MyPagerAdapter extends FragmentPagerAdapter { List<Fragment> fragments; public MyPagerAdapter(FragmentManager fm,List<Fragment> f) { super(fm); this.fragments = f; } @Override public Fragment getItem(int arg0) { return fragments.get(arg0); } @Override public int getCount() { // TODO Auto-generated method stub return fragments.size(); } } 

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" > <android.support.v4.view.ViewPager android:id="@+id/viewpager" android:layout_below="@+id/titles" android:layout_width="fill_parent" android:layout_height="fill_parent" /> </RelativeLayout> 

Для этого я создал класс для создания индикатора страницы

 public class DotsScrollBar { LinearLayout main_image_holder; public static void createDotScrollBar(Context context, LinearLayout main_holder,int selectedPage,int count) { for(int i=0;i<count;i++) { ImageView dot = null; dot= new ImageView(context); LinearLayout.LayoutParams vp = new LinearLayout.LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT); dot.setLayoutParams(vp); if(i==selectedPage) { try { dot.setImageResource(R.drawable.paging_h); } catch (Exception e) { Log.d("inside DotsScrollBar.java","could not locate identifier"); } }else { dot.setImageResource(R.drawable.paging_n); } main_holder.addView(dot); } main_holder.invalidate(); } } 

Теперь в вашем классе активности вызовите функцию createDotScrollBar как createDotScrollBar ниже:

 public void updateIndicator(int currentPage) { dots_scrollbar_holder.removeAllViews(); DotsScrollBar.createDotScrollBar(this, mDotsScrollbarHolder, mCurrentPage, totalNumberOfPages); } 

И вызвать функцию onPageScrollStateChanged внутри onPageScrollStateChanged

как это :

  @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub switch (state) { case 0: updateIndicator(mCurrentPage); break; } 

Надеюсь, что это будет трюк.

У вас в основном есть три варианта:

1. Используйте собственный андроид PagerTitleStrip

Это очень просто реализовать, просто добавьте его как дочерний элемент в свой ViewPager в xml и определите гравитацию как TOP или BOTTOM следующим образом:

 <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" > <android.support.v4.view.ViewPager android:id="@+id/pager" android:layout_width="fill_parent" android:layout_height="fill_parent"> <android.support.v4.view.PagerTitleStrip android:id="@+id/pager_title_strip" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_gravity="bottom" /> </android.support.v4.view.ViewPager> </RelativeLayout> 

Но, честно говоря, это выглядит не очень хорошо, и я ничего не могу сказать о совместимости в обратном или передовом режиме. Вышеописанное было проверено в API 17

2. Используйте стороннюю библиотеку

Как безумно хороший ViewPagerIndictor от Джейка Уортона

3. Кодируйте свою собственную

Как предложено в ответе от shruti . Даже в этом случае, хотя я бы рекомендовал вам составить код вместе с примером Джейка Уортонов, это действительно так удивительно!

Я создал библиотеку, чтобы удовлетворить потребность в индикаторе страницы в ViewPager. Моя библиотека содержит View под названием DotIndicator. Чтобы использовать мою библиотеку, добавьте compile 'com.matthew-tamlin:sliding-intro-screen:3.2.0' в ваш файл построения градиента.

Вид можно добавить в макет, добавив следующее:

  <com.matthewtamlin.sliding_intro_screen_library.indicators.DotIndicator android:layout_width="wrap_content" android:layout_height="wrap_content" app:numberOfDots=YOUR_INT_HERE app:selectedDotIndex=YOUR_INT_HERE/> 

Вышеприведенный код отлично воспроизводит функциональные возможности точек на рабочем экране Google Launcher, однако, если вы хотите дополнительно настроить его, можно добавить следующие атрибуты:

  • app:unselectedDotDiameter и app:selectedDotDiameter для установки диаметров точек
  • app:unselectedDotColor и app:selectedDotColor для установки цветов точек
  • app:spacingBetweenDots чтобы изменить расстояние между точками
  • app:dotTransitionDuration чтобы установить время для анимации изменения с малого на большое (и обратно)

Кроме того, представление может быть создано программно, используя:

 DotIndicator indicator = new DotIndicator(context); 

Существуют методы для изменения свойств, аналогичных атрибутам. Чтобы обновить индикатор, чтобы отобразить другую страницу как выбранную, просто вызовите метод indicator.setSelectedItem(int, true) изнутри ViewPager.OnPageChangeListener.onPageSelected(int) .

Вот пример использования:

Введите описание изображения здесь

Если вам интересно, библиотека была на самом деле предназначена для создания встроенных экранов, подобных тому, что показано в приведенном выше gif.

Источник Github доступен здесь: https://github.com/MatthewTamlin/SlidingIntroScreen