【Android】viewpager+fragment+tablayout实现滑动菜单栏

转自 :http://www.2cto.com/kf/201512/453380.html


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

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

2.Fragment + ViewPager 带滑动导航条

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

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

【Android】viewpager+fragment+tablayout实现滑动菜单栏_第1张图片

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

1.添加依赖文件

 

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

 

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

2.在布局文件中引入TabLayout

主布局文件如下:

 


    

    
通过上面的示例图我们已经看到了,我们的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的布局文件是这样的:

 

 



    
    

 

4.自定义一个FragmentPagerAdapter

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

 

public class MyFragmentAdapter extends FragmentPagerAdapter {
    private final int PAGE_COUNT = 3;
    private final String[] titles;
    private Context context;
    private List fragments;

    public MyFragmentAdapter(List 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 fragments = new ArrayList();
        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);
    }
}

你可能感兴趣的:(android控件,viewpager,fragment,tablayout,滑动菜单栏)