前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >XYLibrary笔记六:XTab使用笔记

XYLibrary笔记六:XTab使用笔记

作者头像
项勇
发布2023-03-24 13:32:33
4540
发布2023-03-24 13:32:33
举报
文章被收录于专栏:项勇

一.源码传送门(点击末尾阅读原文)

初衷是整理一个可以快速搭建该效果界面的一个框架,利于后期开发。

  • 工具类XTab
  • 测试代码androidxfragment+tab+viewpager
  • 项目中使用非androidx版本XMusic

二.效果图

三.代码

非androidx版本

代码语言:javascript
复制
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.design.widget.TabLayout;
import java.util.List;

public class XTab {
    public static void addTab(TabLayout tabLayout,
                              ViewPager viewPager,
                              final List<Fragment> fragment,
                              final List<String> title,
                              FragmentManager fragmentManager,
                              int offscreenPageLimit,
                              onPageSelected onPageSelected){
        /**
         * 预加载
         */
        viewPager.setOffscreenPageLimit(offscreenPageLimit);
        viewPager.setAdapter(new FragmentPagerAdapter(fragmentManager) {
            @Override
            public Fragment getItem(int position) {
                return fragment.get(position);
            }
            @Override
            public int getCount() {
                return fragment.size();
            }
            @Override
            public CharSequence getPageTitle(int position) {
                return title.get(position);
            }
        });
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int i, float v, int i1) {}

            @Override
            public void onPageSelected(int i) {
                onPageSelected.onPageSelected(i);}

            @Override
            public void onPageScrollStateChanged(int i) {
            }
        });
        // TabLayout关联ViewPager
        tabLayout.setupWithViewPager(viewPager);
    }
    public interface onPageSelected{
        void onPageSelected(int position);
    }
}

androidx版本代码,与非android的仅仅是引用上的差别

代码语言:javascript
复制
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentManager;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import com.google.android.material.tabs.TabLayout;

...
  1. 使用
    • 布局 非androidx:
代码语言:javascript
复制
...
    <android.support.design.widget.TabLayout
        android:layout_width="match_parent"
        app:tabGravity="fill"
        app:tabMode="fixed"
        android:layout_height="wrap_content">
    </android.support.design.widget.TabLayout>

    <android.support.v4.view.ViewPager
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
...

androidx:

代码语言:javascript
复制
...
    <com.google.android.material.tabs.TabLayout
        android:layout_width="match_parent"
        app:tabGravity="fill"
        app:tabMode="fixed"
        android:id="@+id/_tab"
        android:layout_height="wrap_content">
    </com.google.android.material.tabs.TabLayout>

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/_vp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
...

activity中添加

代码语言:javascript
复制
private List<Fragment> mFragment;
    private List<String> mTitle;
    private TabLayout mTabLayout;
    private ViewPager mViewPager;
    private void initFragment() {
        mTabLayout = (TabLayout)findViewById(R.id.playview_tab);
        mViewPager = (ViewPager)findViewById(R.id.playview_midd_vp);
        mFragment = new ArrayList<>();
        mFragment.add(new fragment_00());
        mFragment.add(new fragment_11());
        mFragment.add(new fragment_22());
        mFragment.add(new fragment_33());
        mTitle = new ArrayList<>();
        mTitle.add("歌曲");
        mTitle.add("歌词");
        mTitle.add("歌手");
        mTitle.add("专辑");
        XTab.addTab(mTabLayout,
                mViewPager,
                mFragment,
                mTitle,
                getSupportFragmentManager(),
                1,
                new XTab.onPageSelected() {
            @Override
            public void onPageSelected(int position) {

            }
        });
    }
  1. 一些方法的讲解
    • viewPager中,viewPager.setOffscreenPageLimit(offscreenPageLimit);是设置应保留在页面两侧的页数,以花更少的时间进行布局 经过打印可以,当我设置为2时,启动后前三个fragment走到了onResume完成了预加载
代码语言:javascript
复制
com.xy.fragment I/fragment_00.java: [ (fragment_00.java:27)#onResume ] execute
com.xy.fragment I/fragment_11.java: [ (fragment_11.java:27)#onResume ] execute
com.xy.fragment I/fragment_22.java: [ (fragment_22.java:28)#onResume ] execute

而滑动到第四个时,第一个走了onpause

代码语言:javascript
复制
com.xy.fragment I/fragment_00.java: [ (fragment_00.java:39)#onPause ] execute

而关于viewpager的addOnPageChangeListener方法监听中

onPageScrolled是实时的滑动的距离的绘测

代码语言:javascript
复制
/**
 * This method will be invoked when the current page is scrolled, either as part
 * of a programmatically initiated smooth scroll or a user initiated touch scroll.
 *
 * @param position 当前显示的第一页的位置索引。如果positionOffset不为零,则页面position + 1将可见。
 * @param positionOffset Value from [0, 1) 指示与位置上的页面的偏移量。
 * @param positionOffsetPixels Value 以像素为单位的值,指示与位置的偏移量。
 */
void onPageScrolled(int position, float positionOffset, @Px int positionOffsetPixels);
  • onPageSelected是当前的页面位置
  • onPageScrollStateChanged是滑动状态
代码语言:javascript
复制
/**
 * Indicates that the pager is in an idle, settled state. The current page
 * is fully in view and no animation is in progress.
 * 空闲状态
 */
public static final int SCROLL_STATE_IDLE = 0;

/**
 * Indicates that the pager is currently being dragged by the user.
 * 滑动状态
 */
public static final int SCROLL_STATE_DRAGGING = 1;

/**
 * Indicates that the pager is in the process of settling to a final position.
 * 滑动完成,自动完成调整状态
 */
public static final int SCROLL_STATE_SETTLING = 2;

在XTab工具类中我仅仅把onPageSelected的position值回传出来

代码语言:javascript
复制
XTab.addTab(mTabLayout, 
                mViewPager,
                mFragment,
                mTitle, 
                getSupportFragmentManager(),
                2,
                new XTab.onPageSelected() {
            @Override
            public void onPageSelected(int position) {
                XToast.getInstance().Text("当前页面位置:"+position).LayoutParamsY(750).show();
            }
        });
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-03-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 项勇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.源码传送门(点击末尾阅读原文)
  • 二.效果图
  • 三.代码
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档