Android Studio初学笔记-Day27-ViewPager

ViewPager

ViewPager是个让使用者能左右切换view的功能,而ViewPager是直接继承ViewGroup类,这里可以把它想像成一个容器,这样可以帮助接下来对它的功能有比较好的理解。与多数容器相同,需要透过Adapter绑定资料,这个部分将在接下来的程序码详细讲解。

activity_main.xml

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

   <androidx.viewpager.widget.ViewPager
       android:id="@+id/vw1"
       android:layout_width="match_parent"
       android:layout_height="match_parent">
   <androidx.viewpager.widget.PagerTabStrip
       android:id="@+id/tabstrip"
       android:gravity="center"
       android:layout_width="match_parent"
       android:layout_height="50dp"/>
   </androidx.viewpager.widget.ViewPager>

</RelativeLayout>

这里我有偷加了一个功能,PagerTabStrip。它的功能是负责做到标题栏,让每个view都有属於自己的标题。不过这里要稍微注意一下,PagerTabStrip必须是ViewPager的子类标签,否则是会出错的。
而view的设定就直接在res/layout中加入xml档。如法炮制三份来做测试。

layout_tb(1,2,3)

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:id="@+id/tx1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="tb1"
        android:textSize="30sp"/>
</LinearLayout>

接者是Adapter的设定和继承,ViewPager的Adapter是需要继承PagerAdapter,并加入以下函式。

class MyPagerAdapters extends PagerAdapter{

        @Override
        public int getCount() {
            return ViewContain.size();
        }
        @Override
        public void destroyItem(ViewGroup container,int position,Object object){
            ((ViewPager)container).removeView(ViewContain.get(position));
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            //新增vieww
            ((ViewPager) container).addView(ViewContain.get(position));
            return ViewContain.get(position);
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }
        @Override
        public  CharSequence getPageTitle(int position){
            //在TabStrip的文字
            return titlecontain.get(position);
        }
    }
}

这样基本完成ViewPager的资料配置,这里可以先看函式,而有些变数的部分我接者以下程序码配合注解讲解。

完整程序码

public class MainActivity extends AppCompatActivity {
    //负责储存view的部分
    ArrayList<View> ViewContain = new ArrayList<View>();
    //负责存title
    ArrayList<String> titlecontain = new ArrayList<String>();
    ViewPager pager ;
    PagerTabStrip tabstrip;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        pager = (ViewPager)findViewById(R.id.vw1);
        tabstrip = (PagerTabStrip) findViewById(R.id.tabstrip);
        //取消tab下面的长横线
        tabstrip.setDrawFullUnderline(false);
        //设定tab的背景色
        tabstrip.setBackgroundResource(R.color.teal_200);
        //设定当前tab页签的下划线颜色
        tabstrip.setTabIndicatorColorResource(R.color.purple_200);

        View view1 = LayoutInflater.from(this).inflate(R.layout.layout_tb1,null);
        View view2 = LayoutInflater.from(this).inflate(R.layout.layout_tb2,null);
        View view3 = LayoutInflater.from(this).inflate(R.layout.layout_tb3,null);
        ViewContain.add(view1);
        ViewContain.add(view2);
        ViewContain.add(view3);

        titlecontain.add("今日头条");
        titlecontain.add("今日热点");
        titlecontain.add("今日财经");

        pager.setAdapter(new MyPagerAdapters());
        pager.setCurrentItem(1);//指定跳到某页,一定得设置在setAdapter後面
    }
    class MyPagerAdapters extends PagerAdapter{

        @Override
        public int getCount() {
            return ViewContain.size();
        }
        @Override
        public void destroyItem(ViewGroup container,int position,Object object){
            ((ViewPager)container).removeView(ViewContain.get(position));
        }
        @Override
        public Object instantiateItem(ViewGroup container, int position) {
            //新增vieww
            ((ViewPager) container).addView(ViewContain.get(position));
            return ViewContain.get(position);
        }

        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view == object;
        }
        @Override
        public  CharSequence getPageTitle(int position){
            //在TabStrip的文字
            return titlecontain.get(position);
        }
    }
}

其实也就短短的几行程序码,在设定上非常单纯,大家也可以自己玩看看PagerTabStrip的属性设定,试看看不同的效果。

成果

https://ithelp.ithome.com.tw/upload/images/20210908/20139136AErtx0XJqd.png
今天ViewPager讲到这边,谢谢大家~!/images/emoticon/emoticon41.gif


<<:  [Day 27] Android Studio 七日陨石开发:又到了开启相簿的季节

>>:  IT铁人DAY 27-Visitor 访问者模式

【DAY 20】数据分析没有这麽难,透过 Microsoft Power BI ,让你事半功倍!(更多共享 Power BI 仪表板技巧)

哈罗大家好~ 昨天我们初步了解如何制作一个简单的 Power BI 视觉化报表,让我们可以针对想要了...

Day10 测试写起乃-FactoryBot(2)

今天就来继续介绍 trait、parent、association、alias! alias 简单来...

Day21 xib传值的小教室2

接续昨天。 到到二个页面的程序码中,新增一字串变数,也在生命周期中,使此变数会等於第二页的文字格变数...

【领域展开 04 式】 架站工具的试用决选

货比三家不吃亏,使用前请详阅说明书 继昨天谈到架站工具蛮多种的,认清需求与目标之後,从原本五样工具先...

[Day 21] Reactive Programming - Spring WebFlux(Hello World) Part 1

前言 经过了二十一天,进入到了实作的部分,接下来就会建置一系列实际连线至DB并透过Restful沟通...