今天木事,上班不紧张,写两篇博客充实充实.
本章将实现底部导航栏.如果实现ViewPager+底部导航栏就使用viewPagerIndicator或者是tablayout(5.0新特性),但是宝宝不想用ViewPager只是单纯的Fragment+底部导航栏,这时候可以使用RadioButton或者是FragmentTabHost.对于RadioButton耳熟能详,讲一下FragmentTabHost+Fragment框架的实现.
布局:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<!--这个是fragmentTabHost上边的内容区域-->
<FrameLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
></FrameLayout>
<!--这个是底下四个按钮 TabHost这四个按钮-->
<FrameLayout
android:id="@+id/realtabcontent"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@android:color/white"
>
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
>
<com.yizooo.yizooo.ui.MyFragmentTabHost
android:id="@+id/tab_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
></com.yizooo.yizooo.ui.MyFragmentTabHost>
<View
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="#d6d6d6"/>
</RelativeLayout>
</FrameLayout>
</LinearLayout>
代码:
自定义的FragmentTabHost
/**
* Created by 雪宝宝 on 2016/4/15.
* 自定义TabHost,主界面的下边的四个按钮
*
*/
public class MyFragmentTabHost extends FragmentTabHost {
private String mCurrentTag;//当前选中的tag
private String mNoTabChangedTag;//当前没有选中的tag
public MyFragmentTabHost(Context context) {
super(context);
}
public MyFragmentTabHost(Context context, AttributeSet attrs) {
super(context, attrs);
}
/**
* tab在changed切换的时候
* @param tag
*/
@Override
public void onTabChanged(String tag) {
if(tag.equals(mNoTabChangedTag)){
//如果选中的是不是当前被选中的tag,,就要把当前的tag变为没有选中的状态
setNoTabChangedTag(mCurrentTag);
}else{
//如果选中的还是当前选中的tag,那么就给当前的tag赋值
super.onTabChanged(tag);
mCurrentTag=tag;
}
}
public void setNoTabChangedTag(String tag){
this.mNoTabChangedTag=tag;
}
}
设置枚举:进行切换的桥梁
/**
* Created by 雪宝宝 on 2016/4/15.
* 创建枚举
* 用于界面的切换
*/
public enum MainTab {
GOODS(0, R.string.main_tab_name_goods,R.drawable.goodsicon, GoodsFragment.class),
NEWS(1,R.string.main_tab_name_news,R.drawable.newsicon,NewsFragment.class),
GAME(2,R.string.main_tab_name_game,R.drawable.gameicon, GameFragment.class),
WEALTH(3,R.string.main_tab_name_wealth,R.drawable.wealthicon, WealthFragment.class);
private int id;
private int resName;
private int resIcon;
private Class<?> clz;
private MainTab(int id,int resName,int resIcon,Class<?> clz){
this.id=id;
this.resName = resName;
this.resIcon=resIcon;
this.clz=clz;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getResName() {
return resName;
}
public void setResName(int resName) {
this.resName = resName;
}
public int getResIcon() {
return resIcon;
}
public void setResIcon(int resIcon) {
this.resIcon = resIcon;
}
public Class<?> getClz() {
return clz;
}
public void setClz(Class<?> clz) {
this.clz = clz;
}
}
MainActivity中的使用:
public class MainActivity extends AppCompatActivity implements TabHost.OnTabChangeListener{
private MyFragmentTabHost myTabHost;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
myTabHost = (MyFragmentTabHost)findViewById(R.id.tab_main);// 初始化tabHost
//给tab设置对应的Fragment
myTabHost.setup(this,getSupportFragmentManager(),R.id.realtabcontent);//设置对应的Fragment
if(Build.VERSION.SDK_INT>10){
//如果sdk的版本大于10的话..就可以显示FragmentTabHost
myTabHost.getTabWidget().setShowDividers(0);
initTabs();
myTabHost.setCurrentTab(0);//设置当前的tab
myTabHost.setOnTabChangedListener(this);
}
}
/**
* j监听tab的切换
* @param tabId
*/
@Override
public void onTabChanged(String tabId) {
int size = myTabHost.getTabWidget().getTabCount();//获取个数
for(int i=0;i<size;i++){
View view = myTabHost.getTabWidget().getChildAt(i);//获取被选中的view
if(i==myTabHost.getCurrentTab()){
view.setSelected(true);//已经被选中了
}else{
view.setSelected(false);//没有被选中
}
}
}
/**
* 初始tab
*/
private void initTabs(){
MainTab[] tabs = MainTab.values();
int size = tabs.length;
for(int i= 0; i<size;i++){
MainTab mainTab = tabs[i];
TabHost.TabSpec tab = myTabHost.newTabSpec(getString(mainTab.getResName()));//创建taba
// View view = View.inflate(getApplicationContext(), R.layout.tab_indicator, null);//获取布局
View view = LayoutInflater.from(getApplicationContext()).inflate(R.layout.tab_indicator, null);
TextView title = (TextView) view.findViewById(R.id.tab_title);//获取标题
Drawable drawable = this.getResources().getDrawable(mainTab.getResIcon());//获取头像
title.setCompoundDrawablesWithIntrinsicBounds(null,drawable,null,null);//在其上方设置图片,已经有了固定的宽高
title.setText(getString(mainTab.getResName())); //设置标题内容
tab.setIndicator(view);
tab.setContent(new TabHost.TabContentFactory() {
@Override
public View createTabContent(String tag) {
return new View(MainActivity.this);
}
});
myTabHost.addTab(tab,mainTab.getClz(),null);
}
}
}
同时还要定义view的布局,这里就不写了.到此就完成了FragmentTabHost+Fragment 的框架了.
效果图:
还是蛮不错的,但是需求来了,下边五个tab,其中的一个是凸显出来的图片,动动脑筋儿想一想.......