
Android 联合ViewPager 与 Fragment
发布日期:2021-05-07 23:05:25
浏览次数:13
分类:精选文章
本文共 6921 字,大约阅读时间需要 23 分钟。
文章目录
1 Fragment与Viewpager适配器
1.1 FragmentPageAdapter
- 用于实现Fragment的滑动效果,使用Fragment来填充ViewPager
- 适用于页面比较少的情况,FragmentPagerAdapter消耗更多的内存
- 它会把每一个Fragment保存在内存 中,不用每次切换的时候,去保存现场,切换回来在重新创建,所以用户体验比较好
- 而对 于
Fragment
比较多的情况,需要切换的时候销毁以前的Fragment以释放内存,就可以使用 FragmentStatePagerAdapter
1.2 FragmentStatePagerAdapter
- 用于实现Fragment的滑动效果, 使用Fragment来填充ViewPager
- 适用于页面比较多的情况,FragmentStatePagerAdapter省内存
2 创建 FragmentPageAdapter 适配器
- 重写获取页面的方法
public Fragment getItem(int position) { return fragmentList.get(position); }
- 重写获取长度的方法
public int getCount() { return fragmentList.size(); }
import androidx.annotation.NonNull;import androidx.fragment.app.Fragment;import androidx.fragment.app.FragmentManager;import androidx.fragment.app.FragmentPagerAdapter;import java.util.List;public class MyFragmentPagerAdapter extends FragmentPagerAdapter { // 定义Fragment列表来存放Fragment private ListfragmentList; // 1. 定义构造方法 public MyFragmentPagerAdapter(@NonNull FragmentManager fm, List listFragment) { super(fm); this.fragmentList = listFragment; } public MyFragmentPagerAdapter(FragmentManager fm, int behavior) { super(fm, behavior); } @NonNull @Override // 2. 显示页面,为数组中的Fragment’ public Fragment getItem(int position) { return fragmentList.get(position); } @Override // 3. 获取页面的个数,几位列表的长度 public int getCount() { return fragmentList.size(); }}
2.1 切换不同的Fragment
// 设置索引显示fragment,private void showFragment(int position) { // viewPage中的适配器,按照索引进行显示 viewPager.setCurrentItem(position); // 设置当前显示的位置}
2.2 ViewPager滑动监听
// 设置页数改变后的响应, 允许公共访问 public class MyPageChangeListener implements ViewPager.OnPageChangeListener { @Override // 页面滑动的时候 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override // 页面选中时调用 public void onPageSelected(int position) { if (position == 0) { // 第一个页面的时候, 改变底部状态 tab_1.setBackgroundColor(Color.RED); tab_2.setBackgroundColor(Color.WHITE); tab_3.setBackgroundColor(Color.WHITE); } else if (position == 1) { // 第二个页面的时候,改变底部状态 tab_1.setBackgroundColor(Color.WHITE); tab_2.setBackgroundColor(Color.RED); tab_3.setBackgroundColor(Color.WHITE); } else if (position == 2) { tab_1.setBackgroundColor(Color.WHITE); tab_2.setBackgroundColor(Color.WHITE); tab_3.setBackgroundColor(Color.RED); } } @Override // 页面滑动时,状态改变 public void onPageScrollStateChanged(int state) { } }
3 UI部分代码
- 设置UI类为监听器
import androidx.appcompat.app.AppCompatActivity;import androidx.fragment.app.Fragment;import androidx.viewpager.widget.ViewPager;import android.graphics.Color;import android.os.Bundle;import android.view.View;import android.widget.TextView;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity implements View.OnClickListener { // 定义控件 private TextView tab_1, tab_2, tab_3; private ViewPager viewPager; // 切换区 private ListfragmentList; // fragment数组 private MyFragmentPagerAdapter myFragmentPagerAdapter; // 适配器 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initUI(); initTab(); } // 初始化UI 获取控件,并设置监听器 private void initUI() { tab_1 = findViewById(R.id.tab_1); tab_2 = findViewById(R.id.tab_2); tab_3 = findViewById(R.id.tab_3); tab_1.setOnClickListener(this); tab_2.setOnClickListener(this); tab_3.setOnClickListener(this); // 初始化切换区 viewPager = findViewById(R.id.my_view_Pager); } // 显示Page以及其标签 private void initTab() { // 1. 创建Page界面 FragmentOne fragmentOne = new FragmentOne(); FragmentTwo fragmentTwo = new FragmentTwo(); FragmentThree fragmentThree = new FragmentThree(); fragmentList = new ArrayList<>(); // 添加到列表中 fragmentList.add(fragmentOne); fragmentList.add(fragmentTwo); fragmentList.add(fragmentThree); // 3. 新建适配器 myFragmentPagerAdapter = new MyFragmentPagerAdapter(getSupportFragmentManager(),fragmentList); // 4. 设置适配器到viewPager viewPager.setAdapter(myFragmentPagerAdapter); // 5. 设置滑动监听 viewPager.addOnPageChangeListener(new MyPageChangeListener()); // 默认展示第一个界面 showFragment(0); } // 设置索引显示fragment, private void showFragment(int position) { // viewPage中的适配器,按照索引进行显示 viewPager.setCurrentItem(position); // 设置当前显示的位置 // 根据坐标设置底部按钮的颜色 if (position == 0) { tab_1.setBackgroundColor(Color.RED); tab_2.setBackgroundColor(Color.WHITE); tab_3.setBackgroundColor(Color.WHITE); } else if (position == 1) { // 只有一个被选中,各个标签是冲突的 tab_1.setBackgroundColor(Color.WHITE); tab_2.setBackgroundColor(Color.RED); tab_3.setBackgroundColor(Color.WHITE); } else if (position == 2) { tab_1.setBackgroundColor(Color.WHITE); tab_2.setBackgroundColor(Color.WHITE); tab_3.setBackgroundColor(Color.RED); } } @Override // 根据点击的View的ID 来改变下面标签的布局 public void onClick(View v) { if (v.getId() == R.id.tab_1) { showFragment(0); } else if (v.getId() == R.id.tab_2) { showFragment(1); } else if (v.getId() == R.id.tab_3) { showFragment(2); } } // 设置页数改变后的响应, 允许公共访问 public class MyPageChangeListener implements ViewPager.OnPageChangeListener { @Override // 页面滑动的时候 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override // 页面选中时调用 public void onPageSelected(int position) { if (position == 0) { // 第一个页面的时候, 改变底部状态 tab_1.setBackgroundColor(Color.RED); tab_2.setBackgroundColor(Color.WHITE); tab_3.setBackgroundColor(Color.WHITE); } else if (position == 1) { // 第二个页面的时候,改变底部状态 tab_1.setBackgroundColor(Color.WHITE); tab_2.setBackgroundColor(Color.RED); tab_3.setBackgroundColor(Color.WHITE); } else if (position == 2) { tab_1.setBackgroundColor(Color.WHITE); tab_2.setBackgroundColor(Color.WHITE); tab_3.setBackgroundColor(Color.RED); } } @Override // 页面滑动时,状态改变 public void onPageScrollStateChanged(int state) { } }}
发表评论
最新留言
做的很好,不错不错
[***.243.131.199]2025年04月09日 08时46分46秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
Android wm命令
2021-05-08
boot.img 解包与打包
2021-05-08
Android4.4 平板背光设置
2021-05-08
递归复习--二叉搜索树
2021-05-08
数据库
2021-05-08
jvm-02
2021-05-08
ThreadLocal的使用总结
2021-05-08
jvm-05
2021-05-08
spring boot@Value和bean执行顺序问题
2021-05-08
从浏览器输入网址到服务器返回经历的过程
2021-05-08
CPU过载内存溢出分析
2021-05-08
解决Genymotion无法拖拽的问题
2021-05-08
中国石油大学《计算机文化基础》在线考试(客观题)
2021-05-08
中国石油大学《 管理心理学(行政管理专业禁选)》在线考试
2021-05-08
石油远程《数控技术》在线考试
2021-05-08
机器学习(numpy/matplotlib/scipy)学习笔记
2021-05-08