zoukankan      html  css  js  c++  java
  • 使用TabLayout快速实现一个导航栏

    在没有Material Design的年代,要实现一个类似微信主页面的效果,我们有以下几种解决方案:

    1.Fragment + ViewPager  +  RadioGroup自定义固定导航条

    2.Fragment + ViewPager  带滑动导航条

    3.Fragment + ViewPager +  HorizontalScrollView自定义滑动导航条

    当然,除了这些之外,还有许多已经被Google丢弃的方案,我们就不说了。当有了Material Design之后,一切都变得那么漂亮,也变得那么简单,我们今天就来看看怎么用TabLayout快速实现一个导航栏。先来看看效果图:

    这就是我们要实现的一个效果,好了,开始吧。

    1.添加依赖文件

    compile 'com.android.support:design:23.1.1'
    compile 'com.android.support:support-v4:23.1.1'

    在gradle文件中添加上面两个文件的依赖。

    2.在布局文件中引入TabLayout

    主布局文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout 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"
        android:orientation="vertical">
    
        <android.support.design.widget.TabLayout
            android:id="@+id/tab_layout_navi"
            android:layout_width="match_parent"
            app:tabMode="scrollable"
            android:layout_height="wrap_content" />
    
        <android.support.v4.view.ViewPager
            android:id="@+id/view_pager"
            android:layout_width="match_parent"
            android:layout_height="0dp"
            android:layout_weight="1"></android.support.v4.view.ViewPager>
    </LinearLayout>
    通过上面的示例图我们已经看到了,我们的App上面是一个TabLayout,下面是一个ViewPager,所以我们的布局文件中添加这两个东西就可以了,注意TabLayout的引用方式。

    3.创建Fragment

    实际开发中我们可能需要创建多个Fragment,在这里做示例我就只创建一个,然后多次使用,思路是这样的,每次实例化一个Fragment的时候,传入该Fragment要显示的文本,代码如下:

    public class MyFragment extends Fragment {
        private static final String ARG_PARAM1 = "param1";
        private String mParam1;
    
        public static MyFragment newInstance(String param1) {
            MyFragment fragment = new MyFragment();
            Bundle args = new Bundle();
            args.putString(ARG_PARAM1, param1);
            fragment.setArguments(args);
            return fragment;
        }
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            if (getArguments() != null) {
                mParam1 = getArguments().getString(ARG_PARAM1);
            }
        }
    
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_my, null);
            TextView content = (TextView) view.findViewById(R.id.fg_tv);
            content.setText(mParam1);
            return view;
        }
    }
    Fragment的布局文件是这样的:

    <FrameLayout 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"
        tools:context="lenve.tablayouttest.fragment.MyFragment">
    
        <!-- TODO: Update blank fragment layout -->
        <TextView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:gravity="center"
            android:id="@+id/fg_tv"
            android:text="@string/hello_blank_fragment" />
    
    </FrameLayout>

    4.自定义一个FragmentPagerAdapter

    这个FragmentPagerAdapter我们在之前使用ViewPager的时候都有自定义过,这里就不多说了,直接上代码:

    public class MyFragmentAdapter extends FragmentPagerAdapter {
        private final int PAGE_COUNT = 3;
        private final String[] titles;
        private Context context;
        private List<Fragment> fragments;
    
        public MyFragmentAdapter(List<Fragment> fragments,String[] titles, FragmentManager fm, Context context) {
            super(fm);
            this.context = context;
            this.fragments = fragments;
            this.titles = titles;
        }
    
        @Override
        public Fragment getItem(int position) {
            return fragments.get(position);
        }
    
        @Override
        public int getCount() {
            return fragments.size();
        }
    
        @Override
        public CharSequence getPageTitle(int position) {
            return titles[position];
        }
    }
    注意,这里有个不同的地方就是我们重写了方法getPageTitle,这个方法返回ViewPager中每个Fragment对应的title。

    最后,我们再来看看MainActivity,首先初始化数据,初始化Fragment,这些都是ViewPager基本用法,我们来看看最后一句,这一句就是将ViewPager和TabLayout绑定在一起,实现了ViewPager和TabLayout的同步。

    public class MainActivity extends AppCompatActivity {
    
        private String[] titles = new String[]{"聊天", "好友", "发现", "我的","聊天", "好友", "发现", "我的","聊天", "好友", "发现", "我的"};
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);
            List<Fragment> fragments = new ArrayList<Fragment>();
            for (int i = 0; i < titles.length; i++) {
                fragments.add(MyFragment.newInstance(titles[i]));
            }
            FragmentPagerAdapter adapter = new MyFragmentAdapter(fragments, titles, getSupportFragmentManager(), this);
            viewPager.setAdapter(adapter);
            TabLayout tabLayout = (TabLayout) findViewById(R.id.tab_layout_navi);
            tabLayout.setupWithViewPager(viewPager);
        }
    }

    Demo下载http://download.csdn.net/detail/u012702547/9349175


  • 相关阅读:
    Thinkphp5.0 模型hasOne、hasMany、belongsTo详解
    ES6中async和await说明和用法
    必会SQL练习题
    Git初识学习
    CI框架简单使用
    JavaScript 的 this 原理
    javascript实现游戏贪吃蛇
    js清除childNodes中的#text(选项卡中会用到获取第一级子元素)
    JavaNIO
    MongoDB入门_shell基本操作
  • 原文地址:https://www.cnblogs.com/lenve/p/5865916.html
Copyright © 2011-2022 走看看