Android Material design 中TabLayout+Viewpager实现导航栏

Material design

1 背景

最近新项目中又是需要用到头部导航栏,想想这些东西平时我们都是自己写,还有文字下面的那条线,还需要算线的滑动距离。好了又是一大堆堆代码。论坛里虽然有很多这样的案例。实现肯定可以实现,只是这样实现起来很麻烦。今天推荐大家一种更简洁的方法使用Material design包中的tablayout+viewpager就可以轻松实现,也不需要自己动手画线算距离。先来看看效果图。

看似简单的效果,自己写真的很麻烦

2 导包

这里我们只介绍android studio导包:
我们直接在build.gradle中添加这行代码:

compile 'com.android.support:design:25.2.0'

添加这个design包就行。

3 布局

<android.support.design.widget.TabLayout
        android:id="@+id/tab"
        android:layout_width="match_parent"
        android:layout_height="48dp"
        app:tabIndicatorColor="@color/colorPrimary"
        app:tabMode="scrollable"
        app:tabSelectedTextColor="@color/colorPrimary"
        app:tabTextColor="#333333" />

    <android.support.v4.view.ViewPager
        android:id="@+id/viewpager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

这里就是我们使用的tablayout,我们一个一个来介绍他的属性:
1.tabIndicatorColor

app:tabIndicatorColor="@color/colorPrimary"

这个属性就是他文字下面的那条线的颜色。这里线不需要我们去绘制,design中给我提供了这条线。
2. tabMode

app:tabMode="scrollable"

这个属性就是如果太多的导航标题会超出屏幕,此时使用这个属性就支持导航栏滑动啦,他的字面也是也是可滑动的。有滑动当然也就有不可滑动“fixed”。少量的标题就可以使用这个属性。

3.tabSelectedTextColor,tabTextColor

app:tabTextColor="#333333"
app:tabSelectedTextColor="@color/colorPrimary"

很容易看出这两个属性就是文字选中状态和未选中状态时候的颜色。

好了布局其实就是这么点,主要就是他的属性需要弄明白就行,下面的Viewpager我就不多介绍了,大家应该用的也很多了。

4 Activity

public class MainActivity extends AppCompatActivity {
    private ViewPager viewPager;
    private TabLayout tabLayout;
    private List<BaseFragment> list;
    private FragmentListAdapter adapter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();
        list = new ArrayList<>();
        initData(list);
        adapter=new FragmentListAdapter(getSupportFragmentManager(),list);
        viewPager.setAdapter(adapter);
        tabLayout.setupWithViewPager(viewPager);//tablayout和viewpager之前的联动

    }

    private void initData(List<BaseFragment> list) {
        FirstFragment a = new FirstFragment();
        FirstFragment b = new FirstFragment();
        FirstFragment c = new FirstFragment();
        FirstFragment d = new FirstFragment();
        FirstFragment e = new FirstFragment();
        FirstFragment f = new FirstFragment();
        list.add(a);
        list.add(b);
        list.add(c);
        list.add(d);
        list.add(e);
        list.add(f);
    }

    private void init() {
        viewPager = (ViewPager) findViewById(R.id.viewpager);
        tabLayout = (TabLayout) this.findViewById(R.id.tab);
    }
}

其实activity中我们没多少东西,我想大家肯定也看的懂。


5 adapter


接下来就是他的适配器了viewpager我们一般都有会继承FragmentPagerAdapter这个适配器;

public class FragmentListAdapter extends FragmentPagerAdapter {
    private List<BaseFragment> list;

    public FragmentListAdapter(FragmentManager fm, List<BaseFragment> list) {
        super(fm);
        this.list = list;

    }

    @Override
    public Fragment getItem(int position) {
        return list.get(position);
    }

    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public CharSequence getPageTitle(int position) {

        return list.get(position).getTitle();
    }

}

适配器的东西也不多,通过构造函数把activity中fragment数量存倒list中。在adapter中拿到list。

到这里大部分代码也就差不多写好了,接下来就是我们的fragment了


6 fragment


我们谢了一个父类的fragment,通过父类我们拿到标题栏的文本。

public abstract class BaseFragment extends Fragment {
    public abstract String getTitle();
}

这里使用了抽象类。
我们的fragment继承这个basefragment
子类fragment:

public class FirstFragment extends BaseFragment {
    Button button;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container,    @Nullable Bundle savedInstanceState) {
        View rootView = inflater.inflate(R.layout.layout, null);
        button = (Button) rootView.findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(getContext(), RecycleViewActivity.class);
                startActivity(intent);
            }
        });
        return rootView;
    }

    @Override
    public String getTitle() {
        return "Fragment";//这里我们父类中的方法直接获取title文本。
    }

代码就这些。功能基本也就实现了,相比我以前自己写的那种方法真的方便很多。特别是activity中省去了很多的代码,在布局中代码也很简洁。大家不妨可以去试试。对于新手来说很值得学习。而且在我们的项目中也经常会用到,如果有什么错误的地方。希望大家指出。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值