以前实现底部菜单常用TabActivity+TabHost,android3.0以后不建议使用,而使用fragment替代
新建bottommenu.xml布局文件
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <FrameLayout android:id="@+id/bt" android:layout_width="fill_parent" android:layout_height="0dp" android:layout_weight="1" android:background="#ff00ff" > </FrameLayout> <RadioGroup android:id="@+id/tab_rg_menu" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/mmfooter_bg" android:orientation="horizontal" > <RadioButton android:id="@+id/tab_rb_1" style="@style/tab_rb_style" android:checked="true" android:drawableTop="@drawable/tab_selector_weixing" android:text="微信" /> <RadioButton android:id="@+id/tab_rb_2" style="@style/tab_rb_style" android:drawableTop="@drawable/tab_selector_tongxunlu" android:text="通讯录" /> <RadioButton android:id="@+id/tab_rb_3" style="@style/tab_rb_style" android:drawableTop="@drawable/tab_selector_faxian" android:text="发现" /> <RadioButton android:id="@+id/tab_rb_4" style="@style/tab_rb_style" android:drawableTop="@drawable/tab_selector_wo" android:text="自己" /> </RadioGroup> </LinearLayout>
这里使用RadioGroup来实现底部菜单选项,FrameLayout作为内容容器
FrameLayout的layout_weight设置成1是为了除了底部的菜单选项,其他
高度由他占满。
在用layout_weight布局时一般配合相应的高度或宽度设置成0dip,例如这里的
android:layout_height="0dp"
由于所有的RadioButton都有共同的样式属性,所以可以相同的地方提出来,
供所有的引用
在values的styles.xml里边新建一个样式组
<style name="tab_rb_style"> <item name="android:layout_width" >0dp</item> <item name="android:layout_height" >wrap_content</item> <item name="android:layout_weight" >1</item> <item name="android:button" >@null</item> <item name="android:textColor" >@color/tab_selector_tv_color</item> <item name="android:gravity" >center_horizontal|bottom</item> <item name="android:layout_gravity" >bottom</item> <item name="android:background" >@drawable/tab_selector_checked_bg</item> </style>使用style="@style/tab_rb_style"方式引用
制作菜单的时候需要在不同状态下改变控件的样式,一般背景图片等。
这是就需要使用到selector,他提供很多状态对应的属性设置。
例如:这里就是控件单选按钮在选择与否时候的图片
<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_checked="false" android:drawable="@drawable/tab_find_frd_normal"></item> <item android:state_checked="true" android:drawable="@drawable/tab_find_frd_pressed"></item> </selector>
然后新建一个activity BottomMenu引用制作好的布局文件运行就可以看到
fragmentTabHost相当于就是一个装满fragment的容器,我们可以使用
fragmentTabHost.setCurrentTab(x)来进行fragment的切换
现在在原来bottommenu.xml文件中加入FragmentTabHost布局
<android.support.v4.app.FragmentTabHost android:id="@android:id/tabhost" android:layout_width="match_parent" android:layout_height="wrap_content" android:visibility="gone" > <FrameLayout android:id="@android:id/tabcontent" android:layout_width="0dp" android:layout_height="0dp" android:layout_weight="0" /> </android.support.v4.app.FragmentTabHost>
在为RadioGroup添加好事件进行tab切换即可
fth.setup(this, getSupportFragmentManager(), R.id.bt);最后一个参数是指定容器id也就是
布局文件中的FrameLayout
package com.aj.textui; import com.example.myfragment.Fragment1; import com.example.myfragment.Fragment2; import com.example.myfragment.R; import android.os.Bundle; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentTabHost; import android.widget.RadioGroup; import android.widget.RadioGroup.OnCheckedChangeListener; import android.widget.TabHost.TabSpec; public class BottomMenu extends FragmentActivity{ @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.bottom_tab); initview();//不调用会报错提示没有有tab增加项 } public void initview() { final FragmentTabHost fth =(FragmentTabHost)findViewById(android.R.id.tabhost); fth.setup(this, getSupportFragmentManager(), R.id.bt); TabSpec tabSpec = fth.newTabSpec(1 + "").setIndicator(1 + ""); TabSpec tabSpec2 = fth.newTabSpec(2 + "").setIndicator(2 + ""); TabSpec tabSpec3 = fth.newTabSpec(3 + "").setIndicator(3 + ""); TabSpec tabSpec4 = fth.newTabSpec(4 + "").setIndicator(4 + ""); // 将Tab按钮添加进Tab选项卡中 fth.addTab(tabSpec,Fragment1.class, null); fth.addTab(tabSpec2,Fragment2.class, null); fth.addTab(tabSpec3,Fragment1.class, null); fth.addTab(tabSpec4,Fragment2.class, null); RadioGroup rg = (RadioGroup)findViewById(R.id.tab_rg_menu); rg.setOnCheckedChangeListener(new OnCheckedChangeListener(){ @Override public void onCheckedChanged(RadioGroup group, int checkedId) { // TODO Auto-generated method stub switch (checkedId) { case R.id.tab_rb_1: fth.setCurrentTab(0); break; case R.id.tab_rb_2: fth.setCurrentTab(1); break; case R.id.tab_rb_3: fth.setCurrentTab(2); break; case R.id.tab_rb_4: fth.setCurrentTab(3); break; default: break; } } }); fth.setCurrentTab(0); } }
向Fragment传参数
Bundle bu = new Bundle(); bu.putString("pretty", "girl"); fth.addTab(tabSpec3,MainFragment.class, bu);fragment中取
Bundle ga = getArguments(); String val = ga.getString("pretty");
注意:
FragmentTabHost+Fragment实现的菜单需要使用
android.support.v4中的+Fragment
因为FragmentTabHost是在android.support.v4.app.Fragment中
得到FragmentManager的方式为getSupportFragmentManager()
而在3.0以后可以使用
ActionBar.Tab +Fragment代替
FragmentTabHost+Fragment
此时Fragment使用的是android.app.Fragment
得到FragmentManager的方式为getFragmentManager()
http://www.eoeandroid.com/thread-327577-1-1.html
二;其实完全可以自己实现对fragment的管理,比如对fragments的隐藏显示,还是重新加载等,
用fragmentTabHost有时间不是很灵活
public void switchContent(Fragment current,Fragment fragment) { try{ FragmentTransaction transaction = getSupportFragmentManager() .beginTransaction(); if(!fragment.isAdded()) { transaction.hide(current).add(R.id.bt,fragment).commit(); } else { // 隐藏当前的fragment,显示下一个 transaction.hide(current).show(fragment).commit(); } } catch(Exception e) { } }
private void c2() { final FragmentTabHost fth =(FragmentTabHost)findViewById(android.R.id.tabhost); fth.setCurrentTab(2); List<Fragment> li = getSupportFragmentManager().getFragments(); if(li!=null){ for(int i=0;i<li.size();i++) { Fragment f=li.get(i); if(f!=null) { if(f.isVisible()) { getSupportFragmentManager().beginTransaction().hide(f).commit(); } /*String simplename=f.getClass().getSimpleName(); System.out.println(simplename); System.out.println("isAdded:"+f.isAdded()); System.out.println("isHidden:"+f.isHidden()); System.out.println("isVisible:"+f.isVisible());*/ } } } }
Fragment f =getActivity().getSupportFragmentManager().findFragmentByTag(mmsi);
http://www.kwstu.com/ArticleView/kwstu_201408210609378926