1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 011 Android TabLayout+ViewPager实现顶部滑动效果(多个页面)

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

时间:2018-12-21 11:36:35

相关推荐

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

1.TabLayout介绍

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

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

参考文献:/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="/apk/res/android"xmlns:app="/apk/res-auto"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="vertical"tools:context=".MainActivity"><android.support.design.widget.TabLayoutandroid:id="@+id/tablayout"android:layout_width="match_parent"android:layout_height="wrap_content"></android.support.design.widget.TabLayout><android.support.v4.view.ViewPagerandroid: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="/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"><TextViewandroid: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="/apk/res/android"android:layout_width="match_parent"android:gravity="center"android:layout_height="match_parent"><Buttonandroid: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="/apk/res/android"xmlns:app="/apk/res-auto"android:layout_width="match_parent"android:gravity="center"android:layout_height="match_parent"><ImageViewandroid: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={"新闻","财经","娱乐"}; //定义一个数组存放标题内容@Overrideprotected 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;}@Overridepublic Fragment getItem(int position) {return list.get(position);}@Overridepublic int getCount() {return list.size();}//重写getPageTitle()方法,获取页标题 @Nullable@Overridepublic 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@Overridepublic 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@Overridepublic 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@Overridepublic 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 mon.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@Overridepublic 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);}//抽象方法必须重写(即子类必须实现父类的抽象方法) @Overridepublic Fragment getItem(int position) {return mFragmentArrays[position];}@Overridepublic int getCount() {return mFragmentArrays.length;}@Overridepublic 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 monCallback<String>() {@Overridepublic void onSuccess(String result) {//解析resultqueryResultStr=result;System.out.println(result);//写缓存CacheUtils.setCache(ConstantValue.CATEGORY_URL,queryResultStr,getActivity());}//请求异常后的回调方法 @Overridepublic void onError(Throwable ex, boolean isOnCallback) {}//主动调用取消请求的回调方法 @Overridepublic void onCancelled(CancelledException cex) {}@Overridepublic 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 /1/12.*/public class TabFragment extends Fragment {//新建一个Fragment实例public static Fragment newInstance() {TabFragment fragment = new TabFragment();return fragment;}@Nullable@Overridepublic 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 /1/12.*/public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.AuthorViewHolder> {@Overridepublic 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;}@Overridepublic void onBindViewHolder(AuthorViewHolder holder, int position) {}@Overridepublic 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)效果图

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。