以前实现底部菜单常用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相当于就是一个装满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>
在BottomMenu activity中为FragmentTabHost加入fragment,
在为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
菜单切换我们使用Fragment但是菜单页面中的子项一般用Activity,千万不要全部都去使用Fragment,可以把Fragment理解成AJAX不用全部刷新
是部分页面刷新,完全切换的时候还是直接用Activity跳转