4

我正在开发一个应用程序,我在其中实现了 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

    }


}

适配器.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();
    }
}

主要的.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>
4

3 回答 3

5

为此,我创建了一个类来创建页面指示器

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

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

并在里面调用 updateIndicator 函数onPageScrollStateChanged

像这样 :

    @Override
        public void onPageScrollStateChanged(int state) {
            // TODO Auto-generated method stub
switch (state) {

        case 0:
    updateIndicator(mCurrentPage);
break;
        }

希望这能解决问题。

于 2013-06-14T11:52:17.027 回答
5

你基本上有三个选择:

1.使用安卓原生PagerTitleStrip

这很容易实现,只需将其作为子项添加到 xml 中的 ViewPager 并将重力定义为 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.使用第三方库

就像来自 Jake Wharton的出色的ViewPagerIndictor

3. 编写自己的实现代码

就像shruti 的回答中所建议的那样。即使在这种情况下,尽管我建议您与 Jake Whartons 示例一起编写代码,但它真的太棒了!

于 2013-06-14T12:02:20.477 回答
2

我创建了一个库来解决 ViewPager 中对页面指示器的需求。我的库包含一个名为 DotIndicator 的视图。要使用我的库,请添加compile 'com.matthew-tamlin:sliding-intro-screen:3.2.0'到您的 gradle 构建文件。

可以通过添加以下内容将视图添加到您的布局中:

    <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:unselectedDotDiameterapp:selectedDotDiameter设置点的直径
  • app:unselectedDotColorapp:selectedDotColor设置点的颜色
  • app:spacingBetweenDots改变点之间的距离
  • app:dotTransitionDuration设置动画从小到大(和回来)的变化的时间

此外,可以使用以下方式以编程方式创建视图:

DotIndicator indicator = new DotIndicator(context);

存在修改属性的方法,类似于属性。要更新指示器以显示选定的不同页面,只需indicator.setSelectedItem(int, true)从内部调用方法ViewPager.OnPageChangeListener.onPageSelected(int)

这是它的一个使用示例:

在此处输入图像描述

如果您有兴趣,该库实际上是设计用于制作如上图所示的介绍屏幕。

Github 源代码可在此处获得:https ://github.com/MatthewTamlin/SlidingIntroScreen

于 2016-03-01T21:14:39.050 回答