Android?ViewPager2?+?Fragment?聯(lián)動(dòng)效果的實(shí)現(xiàn)思路
Android ViewPager2 + Fragment 聯(lián)動(dòng)
本篇主要介紹一下 ViewPager2 + Fragment , 上篇中簡(jiǎn)單使用了ViewPager2 實(shí)現(xiàn)了一個(gè)圖片的滑動(dòng)效果, 那圖片視圖可以滑動(dòng), ViewPager2也可以滑動(dòng) Fragment

概述
ViewPager2 官方對(duì)它的描述就是 以可滑動(dòng)的格式顯示視圖或 Fragment 也就說明提供了滑動(dòng)Fragment的實(shí)現(xiàn) 并且還很簡(jiǎn)單, 下面來看看吧
實(shí)現(xiàn)思路
1.Activity 布局文件中引入 ViewPager2 控件
2.編寫 Fragment 用于填充到ViewPager2中
3.編寫Adapter 實(shí)現(xiàn) FragmentStateAdapter
下面用實(shí)際代碼 來展示 滑動(dòng)Fragment
代碼實(shí)現(xiàn)
Activity 布局文件中引入 ViewPager2 控件
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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"
xmlns:app="http://schemas.android.com/apk/res-auto"
tools:context=".ViewPage2FragmentActivity">
<androidx.viewpager2.widget.ViewPager2
android:id="@+id/viewpager2fragment"
android:layout_width="match_parent"
android:layout_height="300dp"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
android:background="@color/pink"
/>
</androidx.constraintlayout.widget.ConstraintLayout>
編寫 Fragment 用于填充到ViewPager2中
package com.johnny.slzzing;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
/**
* A simple {@link Fragment} subclass.
* Use the {@link ViewPage2Fragment#newInstance} factory method to
* create an instance of this fragment.
*/
public class ViewPage2Fragment extends Fragment {
// TODO: Rename parameter arguments, choose names that match
// the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
private static final String ARG_PARAM1 = "param1";
private static final String ARG_PARAM2 = "param2";
// TODO: Rename and change types of parameters
private String mParam1;
private String mParam2;
public ViewPage2Fragment() {
// Required empty public constructor
}
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @param param1 Parameter 1.
* @param param2 Parameter 2.
* @return A new instance of fragment ViewPage2Fragment.
*/
// TODO: Rename and change types and number of parameters
public static ViewPage2Fragment newInstance(String param1, String param2) {
ViewPage2Fragment fragment = new ViewPage2Fragment();
Bundle args = new Bundle();
args.putString(ARG_PARAM1, param1);
args.putString(ARG_PARAM2, param2);
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mParam1 = getArguments().getString(ARG_PARAM1);
mParam2 = getArguments().getString(ARG_PARAM2);
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_view_page2, container, false);
}
@Override
public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
TextView textView = view.findViewById(R.id.fragmenttextview);
textView.setText(mParam1);
}
}
fragment_view_page2
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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=".ViewPage2Fragment">
<!-- TODO: Update blank fragment layout -->
<TextView
android:id="@+id/fragmenttextview"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:text="@string/hello_blank_fragment"
android:gravity="center"
android:textSize="25sp"
android:textColor="@color/black"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>fragment 很簡(jiǎn)單 就在中間有個(gè)TextView 區(qū)分不同的fragment

編寫Adapter 實(shí)現(xiàn) FragmentStateAdapter
package com.johnny.slzzing;
import android.os.Bundle;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;
import androidx.viewpager2.widget.ViewPager2;
import java.util.Arrays;
import java.util.List;
public class ViewPage2FragmentActivity extends AppCompatActivity {
ViewPager2 viewPage2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_view_page2_fragment);
viewPage2 = findViewById(R.id.viewpager2fragment);
ViewPager2FragmentAdapter viewPager2FragmentAdapter = new ViewPager2FragmentAdapter(this , initFragmentList());
//重點(diǎn) ! 把 viewPage2設(shè)置adapter 這個(gè)adapter 不是去直接繼承RecycleView.Adapter了
viewPage2.setAdapter(viewPager2FragmentAdapter);
}
//初始化3個(gè)fragment
private List<Fragment> initFragmentList() {
ViewPage2Fragment viewPage2Fragment = ViewPage2Fragment.newInstance("我是Fragment1", "");
ViewPage2Fragment viewPage2Fragment2 = ViewPage2Fragment.newInstance("我是Fragment2", "");
ViewPage2Fragment viewPage2Fragment3 = ViewPage2Fragment.newInstance("我是Fragment3", "");
return Arrays.asList(viewPage2Fragment,viewPage2Fragment2,viewPage2Fragment3);
}
// 提供了FragmentStateAdapter 只需要繼承它即可 不用繼承RecycleView.Adapter
static class ViewPager2FragmentAdapter extends FragmentStateAdapter{
private final List<Fragment> fragmentList;
public ViewPager2FragmentAdapter(@NonNull FragmentActivity fragmentActivity, List<Fragment> fragmentList) {
super(fragmentActivity);
this.fragmentList = fragmentList;
}
@NonNull
@Override
public Fragment createFragment(int position) {
return fragmentList.get(position);
}
@Override
public int getItemCount() {
return fragmentList.size();
}
}
}
效果
粉色區(qū)域是可以滑動(dòng)切換 不同的Fragment 的

總結(jié)
本篇主要介紹了 ViewPager2 結(jié)合 Fragment 的基本使用方式 , 讓我們可以快速的實(shí)現(xiàn)滑動(dòng)Fragment 的功能. 后續(xù)還可以結(jié)合 BottomNavigationView 聯(lián)動(dòng) 底部導(dǎo)航欄+滑動(dòng), 有機(jī)會(huì)再說把
到此這篇關(guān)于Android ViewPager2 + Fragment 聯(lián)動(dòng)的文章就介紹到這了,更多相關(guān)Android ViewPager2 Fragment 聯(lián)動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android Studio gradle 編譯提示‘default not found’ 解決辦法
這篇文章主要介紹了Android Studio gradle 編譯提示‘default not found’ 解決辦法的相關(guān)資料,需要的朋友可以參考下2016-12-12
Android實(shí)現(xiàn)自動(dòng)朗讀功能(TTS)
這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)自動(dòng)朗讀功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
Android滑動(dòng)優(yōu)化高仿QQ6.0側(cè)滑菜單(滑動(dòng)優(yōu)化)
之前的實(shí)現(xiàn)只是簡(jiǎn)單的可以顯示和隱藏左側(cè)的菜單,但是特別生硬,而且沒有任何平滑的趨勢(shì),那么今天就來優(yōu)化一下吧,加上平滑效果,而且可以根據(jù)手勢(shì)滑動(dòng)的方向來判斷是否是顯示和隱藏2016-02-02
Android開發(fā)基于ScrollView實(shí)現(xiàn)的漸變導(dǎo)航欄效果示例
這篇文章主要介紹了Android開發(fā)基于ScrollView實(shí)現(xiàn)的漸變導(dǎo)航欄效果,涉及ScrollView事件響應(yīng)及元素屬性動(dòng)態(tài)操作相關(guān)實(shí)現(xiàn)技巧,需要的朋友可以參考下2017-12-12
詳解MVP模式在Android開發(fā)中的應(yīng)用
MVP是MVC衍生而來的,很早以前就由某軟公司提出,近年來在Android應(yīng)用開發(fā)中越來越多的被提及,越來越重要了。這篇文章主要介紹了詳解MVP模式在Android開發(fā)中的應(yīng)用,有興趣的可以了解一下。2016-11-11
Android自定義漸變式炫酷ListView下拉刷新動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android自定義漸變式炫酷ListView下拉刷新動(dòng)畫,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-02-02
Android 控件(button)對(duì)齊方法實(shí)現(xiàn)詳解
horizontal是讓所有的子元素按水平方向從左到右排列,vertical是讓所有的子元素按豎直方向從上到下排列,下面為大家介紹下控件(button)的對(duì)齊方法2013-06-06

