Android開(kāi)發(fā)之ViewPager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面
本文實(shí)例為大家分享了Android開(kāi)發(fā)之ViewPager實(shí)現(xiàn)滑動(dòng)切換頁(yè)面的具體代碼,供大家參考,具體內(nèi)容如下
基本構(gòu)件
activity_main.xml
依然是在簡(jiǎn)單的線性布局里放個(gè)ViewPager組件,注意該組件是在androidx中的。
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ? ? android:layout_height="match_parent" ? ? android:layout_width="match_parent" ? ? android:orientation="vertical"> ? ? <androidx.viewpager.widget.ViewPager ? ? ? ? android:id="@+id/viewpager" ? ? ? ? android:layout_width="match_parent" ? ? ? ? android:layout_height="match_parent"/> </LinearLayout>
次級(jí)頁(yè)面的布局資源
這次我們的ViewPager要實(shí)現(xiàn)三個(gè)頁(yè)面間的滑動(dòng)切換,所以要預(yù)先設(shè)置好三個(gè)頁(yè)面的布局,這里就用非常簡(jiǎn)單的帶背景色的TextView作為布局。
layout1
<?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? xmlns:android1="http://schemas.android.com/apk/res/android" ? ? android1:layout_height="match_parent" ? ? android1:layout_width="match_parent" ? ? android1:background="@color/purple_200" ? ? android1:orientation="vertical"> ? ? <TextView ? ? ? ? android1:textSize="30sp" ? ? ? ? android1:text="layout1" ? ? ? ? android1:layout_width="wrap_content" ? ? ? ? android1:layout_height="wrap_content"/> </LinearLayout>
layout2
<?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? xmlns:android1="http://schemas.android.com/apk/res/android" ? ? android1:layout_height="match_parent" ? ? android1:layout_width="match_parent" ? ? android1:background="@color/purple_500" ? ? android1:orientation="vertical"> ? ? <TextView ? ? ? ? android1:textSize="30sp" ? ? ? ? android1:text="layout2" ? ? ? ? android1:layout_width="wrap_content" ? ? ? ? android1:layout_height="wrap_content"/> </LinearLayout>
layout3
<?xml version="1.0" encoding="utf-8"?> <LinearLayout ? ? xmlns:android1="http://schemas.android.com/apk/res/android" ? ? android1:layout_height="match_parent" ? ? android1:layout_width="match_parent" ? ? android1:background="@color/purple_700" ? ? android1:orientation="vertical"> ? ? <TextView ? ? ? ? android1:textSize="30sp" ? ? ? ? android1:text="layout3" ? ? ? ? android1:layout_width="wrap_content" ? ? ? ? android1:layout_height="wrap_content"/> </LinearLayout>
MainActivity.java
跟ListView類(lèi)似,我們把三個(gè)頁(yè)面從xml中渲染出來(lái),成為java代碼中的一個(gè)View類(lèi)型變量,然后將其裝入一個(gè)List中,最終通過(guò)adapter裝填進(jìn)viewpager里。
package com.example.myviewpager;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
? ? @Override
? ? protected void onCreate(Bundle savedInstanceState) {
? ? ? ? super.onCreate(savedInstanceState);
? ? ? ? setContentView(R.layout.activity_main);
? ? ? ? LayoutInflater inflater = getLayoutInflater().from(this);
? ? ? ? View view1 = inflater.inflate(R.layout.layout1,null);
? ? ? ? View view2 = inflater.inflate(R.layout.layout2,null);
? ? ? ? View view3 = inflater.inflate(R.layout.layout3,null);
? ? ? ? List<View> viewList = new ArrayList<>();
? ? ? ? viewList.add(view1);
? ? ? ? viewList.add(view2);
? ? ? ? viewList.add(view3);
? ? ? ? ViewPager viewpager = findViewById(R.id.viewpager);
? ? ? ? MyAdapter myadapter = new MyAdapter(viewList);
? ? ? ? viewpager.setAdapter(myadapter);
? ? }
}adapter
ViewPager的adapter類(lèi)繼承自PagerAdapter。
首先,需要有一個(gè)構(gòu)造器,使得主函數(shù)中的數(shù)據(jù)能夠傳進(jìn)adapter:
private List<View> listview;
? ? public MyAdapter(List<View> listview) {
? ? ? ? this.listview = listview;
? ? }在MyAdapter中,需要實(shí)現(xiàn)四個(gè)方法:getCount()
獲得viewpagert中有多少個(gè)view,這個(gè)很簡(jiǎn)單,返回列表大小就行了。
@Override
?public int getCount() {
? ? ? ? return listview.size();
? ? }instantiateItem()
1.將給定位置的view添加到ViewGroup(容器)中,創(chuàng)建并顯示出來(lái)。
2.返回一個(gè)代表新增頁(yè)面的Object(key),通常都是直接返回view本身就可以了,當(dāng)然也可以自定義自己的key,但是key和每個(gè)view要一一對(duì)應(yīng)的關(guān)系。
在寫(xiě)instantiateItem()時(shí),可以用快捷鍵Alt+Insert選擇Override Methods,在彈出的界面中輸入字母就可以查找對(duì)應(yīng)的函數(shù),選中即可生成一個(gè)框架(博主這里是因?yàn)橐呀?jīng)實(shí)現(xiàn)了該方法,所以被劃掉了):


@NonNull
@Override
? ? public Object instantiateItem(@NonNull ViewGroup container, int position) {
? ? ? ? container.addView(listview.get(position),0);
? ? ? ? return listview.get(position);
? ? }isViewFromObject()
判斷instantiateltem(ViewGroup,int)函數(shù)所返回來(lái)的Key與一個(gè)頁(yè)面視圖是否是代表的同一個(gè)視圖(即它倆是否是對(duì)應(yīng)的,對(duì)應(yīng)的表示同一個(gè)view),通常我們直接寫(xiě)return view==object。
@Override
?public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
? ? ? ? return view == object;
? ? }destroyltem()
移除一個(gè)給定位置的頁(yè)面。適配器有責(zé)任從容器中冊(cè)刪除這個(gè)視圖。這是為了確保在finishUpdate(viewGroup)返回時(shí)視圖能夠被移除。
@Override
?public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
? ? ? ? container.removeView(listview.get(position));
? ? }實(shí)現(xiàn)效果
可以快樂(lè)地在三個(gè)layout間劃來(lái)劃去(動(dòng)態(tài)效果不太好展示,各位自己實(shí)現(xiàn)出來(lái)觀感更佳)~


以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Android判斷某個(gè)權(quán)限是否開(kāi)啟的方法
今天小編就為大家分享一篇Android判斷某個(gè)權(quán)限是否開(kāi)啟的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-07-07
Android學(xué)習(xí)筆記--通過(guò)Application傳遞數(shù)據(jù)代碼示例
使用Application傳遞數(shù)據(jù)步驟如下:創(chuàng)建新class,取名MyApp,繼承android.app.Application父類(lèi),并在MyApp中定義需要保存的屬性2013-06-06
Android studio 自動(dòng)換行和取消自動(dòng)換行操作
這篇文章主要介紹了Android studio 自動(dòng)換行和取消自動(dòng)換行操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04
Android中EditText光標(biāo)的顯示與隱藏方法
這篇文章主要給大家介紹了關(guān)于Android中EditText光標(biāo)的顯示與隱藏以及Android之第一次不顯示EditText光標(biāo)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-11-11

