fragment + fragmentTabHost实现底部菜单与自定义fragment管理





以前实现底部菜单常用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跳转




评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值