TabLayout是Android 5.0以后推出的实现导航更简洁的方式
开发中常常有如下的导航功能:
现在我们用TabLayout、ViewPager、Fragment来实现它
具体步骤:
1. 在build.gradle中添加依赖
compile 'com.android.support:design:23.2.1'
2. 在xml中引入TabLayout、ViewPager控件
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<android.support.design.widget.TabLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/tab"
/>
<android.support.v4.view.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/vp"
/>
</LinearLayout>
3. 创建三个fragment,OneFragment,TwoFragment,ThreeFragment
package pro.down.com.tab;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class OneFragment extends Fragment {
@Override public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_tab, container, false);
}
}
4. 在Activity中添加相应代码
package pro.down.com.tab;
import android.os.Bundle;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import butterknife.Bind;
import butterknife.ButterKnife;
public class MainActivity extends AppCompatActivity {
@Bind(R.id.tab) TabLayout mTab;
@Bind(R.id.vp) ViewPager mVp;
private static String TAG = "MainActivity";
private BasePageAdapter mAdapter;
@Override protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
//添加fragment到viewpager中
mAdapter = new BasePageAdapter(getSupportFragmentManager());
mAdapter.addFrag(new OneFragment(), "one");
mAdapter.addFrag(new TwoFragment(), "two");
mAdapter.addFrag(new ThreeFragment(), "three");
mVp.setAdapter(mAdapter);
//为tabLayout添加相应的tab
mTab.addTab(mTab.newTab().setText("tab1").setIcon(R.mipmap.ic_launcher));
mTab.addTab(mTab.newTab().setText("tab2").setIcon(R.mipmap.ic_launcher));
mTab.addTab(mTab.newTab().setText("tab3").setIcon(R.mipmap.ic_launcher));
//为viewpager设置监听
mVp.addOnPageChangeListener(new TabLayout.TabLayoutOnPageChangeListener(mTab));
//为tablayout设置监听事件
mTab.setOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override public void onTabSelected(TabLayout.Tab tab) {
Log.d(TAG, "tab被选中时,手动设置viewpager的选中项");
mVp.setCurrentItem(tab.getPosition());
}
@Override public void onTabUnselected(TabLayout.Tab tab) {
}
@Override public void onTabReselected(TabLayout.Tab tab) {
}
});
}
}
代码中使用到的:
- butterknife注入框架请移步
butterknife - BasePageAdapter是自己二次封装的viewpage的适配器,代码如下
package pro.down.com.tab;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;
import java.util.ArrayList;
import java.util.List;
/**
* Created by JesseHev
*/
public class BasePageAdapter extends FragmentPagerAdapter {
private final List<Fragment> mFragments = new ArrayList<>();
private final List<String> mFragmentTitles = new ArrayList<>();
public BasePageAdapter(FragmentManager fm) {
super(fm);
}
@Override public Fragment getItem(int position) {
return mFragments.get(position);
}
public void addFrag(Fragment fragment, String title) {
mFragments.add(fragment);
mFragmentTitles.add(title);
}
public void update(List<Fragment> fragments) {
if (fragments != null && fragments.size() > 0) {
mFragments.clear();
mFragments.addAll(fragments);
notifyDataSetChanged();
}
}
@Override public int getCount() {
return mFragments.size();
}
}
至此功能已经实现!下面列出一些TabLayout常用的属性和方法
TabLayout的相关属性:
更改xml属性的时候,需要在相应的xml文件中的根布局中添加名称空间
xmlns:app="http://schemas.android.com/apk/res-auto"
以下属性都是在TabLayout布局中添加
1. 更改选中tab的字体颜色
app:tabSelectedTextColor="@color/red"
2. 更改未选中tab的字体颜色
app:tabTextColor="@color/colorPrimary"
3. 更改指示器下标的颜色
app:tabIndicatorColor="@color/@color/red"
4. 更改整个TabLayout的背景颜色
app:tabBackground="@color/red"
5. 更改字体样式(大小),没有直接的size属性更改字体大小,需要使用到app:tabTextAppearance来间接改变字体
app:tabTextAppearance="@android:style/TextAppearance.Holo.Large"
@style 后面有三种值可引入分别是大、中、小:
<style name="TextAppearance.Holo.Large" parent="TextAppearance.Large" />
<style name="TextAppearance.Holo.Medium" parent="TextAppearance.Medium" />
<style name="TextAppearance.Holo.Small" parent="TextAppearance.Small" />
- 改变指示器高度
app:tabIndicatorHeight="5dp"
- 给tab的item设置图标
mTab.addTab(mTab.newTab().setText("Tab 1").setIcon(R.mipmap.ic_launcher));
写在结尾
如果不想在addTab的时候去设置icon还可以用另一种方式:
mTab.getTabAt(position).setIcon(R.mipmap.ic_launcher);
position 为item在tab中的下标位置。在item被选中的时候动态改变item图标。
注:上面代码中是以代码的方式生成tab项,还有一种以xml的方式生成tab项目如下:
<android.support.design.widget.TabLayout
android:id="@+id/tab"
android:layout_width="match_parent"
android:layout_height="wrap_content"
>
<android.support.design.widget.TabItem
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:icon="@mipmap/ic_launcher"
android:text="我是item"
/>
</android.support.design.widget.TabLayout>
示例只添加了一个tab,当然你可以自由添加多个tab。
文中的代码可以直接拷贝使用!