package zhangphil.test;
import android.content.Context;
import android.graphics.Color;
import android.support.design.widget.TabLayout;
import android.util.AttributeSet;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.List;
public class MyTabLayout extends TabLayout {
private List titles;
public MyTabLayout(Context context) {
super(context);
init();
}
public MyTabLayout(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MyTabLayout(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
init();
}
private void init() {
titles = new ArrayList<>();
this.addOnTabSelectedListener(new TabLayout.OnTabSelectedListener() {
@Override
public void onTabSelected(Tab tab) {
/**
* 设置当前选中的Tab为特殊高亮样式。
*/
if (tab != null && tab.getCustomView() != null) {
TextView tab_layout_text = tab.getCustomView().findViewById(R.id.tab_layout_text);
tab_layout_text.setTextColor(Color.WHITE);
tab_layout_text.setBackgroundResource(R.drawable.tablayout_item_pressed);
}
}
@Override
public void onTabUnselected(Tab tab) {
/**
* 重置所有未选中的Tab颜色、字体、背景恢复常态(未选中状态)。
*/
if (tab != null && tab.getCustomView() != null) {
TextView tab_layout_text = tab.getCustomView().findViewById(R.id.tab_layout_text);
tab_layout_text.setTextColor(getResources().getColor(android.R.color.holo_red_light));
tab_layout_text.setBackgroundResource(R.drawable.tablayout_item_normal);
}
}
@Override
public void onTabReselected(Tab tab) {
}
});
}
public void setTitle(List titles) {
this.titles = titles;
/**
* 开始添加切换的Tab。
*/
for (String title : this.titles) {
Tab tab = newTab();
tab.setCustomView(R.layout.tablayout_item);
if (tab.getCustomView() != null) {
TextView text = tab.getCustomView().findViewById(R.id.tab_layout_text);
text.setText(title);
}
this.addTab(tab);
}
}
}
注意这个布局中的@+id/tab_layout_text的TextView,这将是后续改变背景颜色和字体颜色的操作对象。事实上如果你愿意,你可以把这个布局写的更加复杂更加多变,不止只有一个TextView,可以有更多的View和ViewGroup,只要有它们的id,然后在后面要介绍的onTabSelected和onTabUnselected里面尽情修改切换它们的表现形式。
这个其实一个简单圆角背景,灰色边框线。res/drawable/tablayout_item_normal.xml将作为未被选中的Tab的背景资源在后续的选中和未被选中时候加载。
在init函数中,给当前的TabLayout增加一个监听器OnTabSelectedListener,然后,onTabSelected表示当前TabLayout被选中的具体是哪一个Tab,有了这个回调函数,并且获得了被选中的具体Tab对象tab,就可以从该Tab提取出该View(通getCustomView()),再找到在setTitle时候添加的每一个Tab的布局R.layout.tab_layout_item中的子View,本例只添加了一个TextView,其id为(android:id="@+id/tab_layout_text")的TextView,为其设置选中的字体颜色和背景。本例是为每一个选中的Tab设置一个res/drawable/tablayout_item_pressed.xml:
在这个背景资源中,实现了圆角渐变颜色。(重要)
具体使用,像Android原生的TabLayout一样把MyTabLayout写到xml布局里面:
然后在上层Java代码写若干选项卡需要的字符串:
package zhangphil.test;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import java.util.Arrays;
import java.util.List;
public class TabActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.tab_avtivity);
String[] str = {"zhang", "phil", "zhang phil", "csdn", "zhang phil csdn", "zhang phil @ csdn", "blog.csdn.net/zhangphil", "android"};
List titles = Arrays.asList(str);
MyTabLayout tabLayout = findViewById(R.id.tab_layout);
tabLayout.setTitle(titles);
}
}