• 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)


    1.TabLayout介绍

      TabLayout提供了一个水平的布局用来展示Tabs,很多应用都有这样的设计,典型的有网易新闻,简书,知乎等。TabLayout就可以很好的完成这一职责,首先TabLayout一般都是配合Viewpager使用的,Viewpager里的Fragment随着顶部的Tab一起联动,这种场景再熟悉不过了。

    注意:了解开源框架MagicIndicator,也能实现顶部菜单栏的功能。

    参考文献:https://blog.csdn.net/qq_24956515/article/details/51871238

    2.实现方法

    (1)design模式下,将TabLayout 拖入界面中

    注意:TabLayout 在container中

    (2)design模式下,将ViewPager拖入界面中

    <1>若出现错误(在xml文件中设置android:orientation="vertical")

    <2>向viewpager中添加页面组件

    (1)创建多个页面

    app--->res--->layout ,选中layout,右击new--->xml--->layout xml file

    (2)将多个页面布局添加到Viewpager中(采用Fragment的方式)

    新建3个MyFragment(继承Fragment)

     注意:View类的介绍:在Activity显示的控件 都叫做View(View类 是所有的控件类的父类 比如 文本 按钮)

    3.源码

    <1>页面XML文件布局

    (1)主页面

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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"
        android:orientation="vertical"
        tools:context=".MainActivity">
    
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tablayout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">
        </android.support.design.widget.TabLayout>
    
        <android.support.v4.view.ViewPager
            android:id="@+id/viewpager"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

    (2)fragment页面1布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:gravity="center">
    
        <TextView
            android:id="@+id/textView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="新闻页面"
            android:textSize="30dp" />
    </LinearLayout>

    (3)fragment页面2布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent">
    
        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="Button" />
    </LinearLayout>

    (4)fragment页面3布局

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:gravity="center"
        android:layout_height="match_parent">
    
        <ImageView
            android:id="@+id/imageView"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:srcCompat="@mipmap/ic_launcher" />
    </LinearLayout>

    <2>后台代码

    (1)MainActivity.java

    package com.lucky.test11;
    
    import android.support.annotation.Nullable;
    import android.support.design.widget.TabLayout;
    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.v7.app.AppCompatActivity;
    import android.os.Bundle;
    
    import java.util.ArrayList;
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        TabLayout tabLayout;
        ViewPager viewPager;
        List<Fragment> fragments; //定义一个列表集合(应用泛型)
        String[] table={"新闻","财经","娱乐"};  //定义一个数组存放标题内容
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            tabLayout=findViewById(R.id.tablayout);
            viewPager=findViewById(R.id.viewpager);
            fragments=new ArrayList<>();  //实例化集合
            fragments.add(new MyFragment1());
            fragments.add(new MyFragment2());
            fragments.add(new MyFragment3());
    
            Adapter adapter=new Adapter(getSupportFragmentManager(),fragments); //参数1为fragment管理器
            viewPager.setAdapter(adapter); //给viewPager设置适配器
            tabLayout.setupWithViewPager(viewPager); //将tabLayout与viewPager建立匹配
        }
    
        //创建一个内部类作为适配器
        public class Adapter extends FragmentPagerAdapter{
            private List<Fragment> list;
            public Adapter(FragmentManager fm,List<Fragment> list) {
                super(fm);
                this.list=list;
            }
    
            @Override
            public Fragment getItem(int position) {
                return list.get(position);
            }
    
            @Override
            public int getCount() {
                return list.size();
            }
    
            //重写getPageTitle()方法,获取页标题
            @Nullable
            @Override
            public CharSequence getPageTitle(int position) {
                return table[position];
            }
        }
    }

    (2)MyFragment1.java

    package com.lucky.test11;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class MyFragment1 extends Fragment {
        //将layout_pageq.xml文件与MyFragment1相关联
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.layout_page1,container,false);
            return view;
        }
    }

    (3)MyFragment2.java

    package com.lucky.test11;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class MyFragment2 extends Fragment {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.layout_page2,container,false);
            return view;
        }
    }

    (4)MyFragment3.java

    package com.lucky.test11;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    public class MyFragment3 extends Fragment {
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.layout_page3,container,false);
            return view;
        }
    }

    4.效果图

    源码:test11

    5.使用案例二

    本案例特点:根据网络请求返回的数据,自动生成tablayout中所要呈现的菜单项。

    (1)NewsCenterFragment.java

    package com.example.administrator.test66smartbeijing.fragment;
    
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    import android.support.design.widget.TabLayout;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v4.app.FragmentPagerAdapter;
    import android.support.v4.view.PagerAdapter;
    import android.support.v4.view.ViewPager;
    import android.text.TextUtils;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.alibaba.fastjson.JSONObject;
    import com.example.administrator.test66smartbeijing.R;
    import com.example.administrator.test66smartbeijing.javabean.NewsMenu;
    import com.example.administrator.test66smartbeijing.utils.CacheUtils;
    import com.example.administrator.test66smartbeijing.utils.ConstantValue;
    
    import org.xutils.common.Callback;
    import org.xutils.http.RequestParams;
    import org.xutils.x;
    
    /**
     * 利用tabLayout+viewPager实现带顶部菜单栏的fragment
     */
    public class NewsCenterFragment extends Fragment {
        private TabLayout tabLayout = null;
        private ViewPager viewPager;
        private Fragment[] mFragmentArrays;
        private String[] mTabTitles;
        String queryResultStr="";
        NewsMenu newsMenu;
    
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view=inflater.inflate(R.layout.layout_fm_newscenter,container,false);
            tabLayout = view.findViewById(R.id.tablayout);
            viewPager = view.findViewById(R.id.tab_viewpager);
            initView();
            return view;
        }
    
        private void initView() {
            //判断有没有缓存,如果有的话,加载缓存,没有的话,请求网络数据
            String cache=CacheUtils.getCache(ConstantValue.CATEGORY_URL,getActivity());
            if(!TextUtils.isEmpty(cache)){
                System.out.println("发现缓存");
                newsMenu = processData(cache);
    
            }else {
                getDataFromServer();
                newsMenu =processData(queryResultStr);
            }
            System.out.println(newsMenu);
            System.out.println(newsMenu.data.get(0).children.size());
            mTabTitles = new String[newsMenu.data.get(0).children.size()];  //放置标题的数组
    
            for (int i = 0; i <mTabTitles.length ; i++) {
                mTabTitles[i]=newsMenu.data.get(0).children.get(i).title;
            }
    
            //tabLayout.setTabMode(TabLayout.MODE_FIXED);
            //设置tablayout距离上下左右的距离
            //tab_title.setPadding(20,20,20,20);
            tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);  //设置tablayout为滚动模式
            mFragmentArrays = new Fragment[mTabTitles.length];
    
            for (int i = 0; i <mTabTitles.length ; i++) {
                mFragmentArrays[i] = TabFragment.newInstance();
            }
            PagerAdapter pagerAdapter = new MyViewPagerAdapter(getActivity().getSupportFragmentManager());
            viewPager.setAdapter(pagerAdapter);  //给viewPager设置适配器
            tabLayout.setupWithViewPager(viewPager);//将ViewPager和TabLayout绑定
        }
    
        final class MyViewPagerAdapter extends FragmentPagerAdapter {
            public MyViewPagerAdapter(FragmentManager fm) {
                super(fm);
            }
    
            //抽象方法必须重写(即子类必须实现父类的抽象方法)
            @Override
            public Fragment getItem(int position) {
                return mFragmentArrays[position];
            }
    
    
            @Override
            public int getCount() {
                return mFragmentArrays.length;
    
            }
    
            @Override
            public CharSequence getPageTitle(int position) {
                return mTabTitles[position];  //获取页标题
            }
        }
    
        /**
         * 从服务器获取数据
         */
        private void getDataFromServer() {
            //请求地址
            String url=ConstantValue.CATEGORY_URL;
            RequestParams params = new RequestParams(url);
            x.http().get(params, new Callback.CommonCallback<String>() {
                @Override
                public void onSuccess(String result) {
                    //解析result
                    queryResultStr=result;
                    System.out.println(result);
    
    
                    //写缓存
                    CacheUtils.setCache(ConstantValue.CATEGORY_URL,queryResultStr,getActivity());
                }
                //请求异常后的回调方法
                @Override
                public void onError(Throwable ex, boolean isOnCallback) {
                }
                //主动调用取消请求的回调方法
                @Override
                public void onCancelled(CancelledException cex) {
                }
                @Override
                public void onFinished() {
                }
            });
    
        }
    
        private NewsMenu processData(String queryResultStr) {
            // 复杂json格式字符串到JavaBean对象的转换
            NewsMenu newsMenu = JSONObject.parseObject(queryResultStr,NewsMenu.class);
            return newsMenu;
        }
    }

    (2)TabFragment.java

    package com.example.administrator.test66smartbeijing.fragment;
    
    import android.os.Bundle;
    import android.support.annotation.Nullable;
    import android.support.v4.app.Fragment;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    
    import com.example.administrator.test66smartbeijing.R;
    import com.example.administrator.test66smartbeijing.utils.RecyclerAdapter;
    
    
    /**
     * Created by zq on 2017/1/12.
     */
    public class TabFragment extends Fragment {
    
        //新建一个Fragment实例
        public static Fragment newInstance() {
            TabFragment fragment = new TabFragment();
            return fragment;
        }
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
            // LayoutInflater.inflate()的功能是将一段 XML 资源文件加载成为 View。所以通常用于将 XML 文件实例化为 View。然后获取 View 上的组件最后操作之。
            View rootView = inflater.inflate(R.layout.fragment_tab, container, false);
            RecyclerView recyclerView = rootView.findViewById(R.id.recycler); //获取recyclerView这个组件
            LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity());
            layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
            recyclerView.setLayoutManager(layoutManager);   //给recyclerView设置布局管理器
            recyclerView.setAdapter(new RecyclerAdapter()); //给recyclerView设置适配器
            return rootView;
        }
    }

    (3)RecyclerAdapter.java

    package com.example.administrator.test66smartbeijing.utils;
    
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.TextView;
    
    import com.example.administrator.test66smartbeijing.R;
    
    
    /**
     * Created by zq on 2017/1/12.
     */
    public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.AuthorViewHolder> {
    
        @Override
        public AuthorViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            View childView = inflater.inflate(R.layout.item, parent, false);
            AuthorViewHolder viewHolder = new AuthorViewHolder(childView);
            return viewHolder;
        }
    
        @Override
        public void onBindViewHolder(AuthorViewHolder holder, int position) {
        }
    
        @Override
        public int getItemCount() {
            return 15;
        }
    
    
        class AuthorViewHolder extends RecyclerView.ViewHolder {
    
            TextView mNickNameView;
            TextView mMottoView;
            public AuthorViewHolder(View itemView) {
                super(itemView);
                mNickNameView = itemView.findViewById(R.id.tv_nickname);
                mMottoView = itemView.findViewById(R.id.tv_motto);
            }
        }
    }

    (4)效果图

  • 相关阅读:
    ERROR: Cannot set priority of registrydns process 33740
    Hbase和Phoenix部署-单机版
    ambari安装hdp时,新建的ambari-hdp-1.repo中baseurl无值
    centos7.2升级openssh到8.0
    kafka一个broker挂掉无法写入
    对cdh搭建过程错误总结及解决方法
    streamsets
    [Spark]Task not serializable
    [Kafka]How to Clean Topic data
    Postgresql Master/Slaver
  • 原文地址:https://www.cnblogs.com/luckyplj/p/10473240.html
Copyright © 2020-2023  润新知