转自 :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快速实现一个导航栏。先来看看效果图:
这就是我们要实现的一个效果,好了,开始吧。
compile 'com.android.support:design:23.1.1'
compile 'com.android.support:support-v4:23.1.1'
在gradle文件中添加上面两个文件的依赖。
主布局文件如下:
通过上面的示例图我们已经看到了,我们的App上面是一个TabLayout,下面是一个ViewPager,所以我们的布局文件中添加这两个东西就可以了,注意TabLayout的引用方式。
实际开发中我们可能需要创建多个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的布局文件是这样的:
这个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);
}
}