开源项目AndroidUtil-採用Fragment实现TabHost

开源项目AndroidUtil-採用Fragment实现TabHost

原文出自:方杰|http://fangjie.sinaapp.com/?p=141 转载请注明出处

学习Android也有一段时间了。感觉大部分的Android应用都有非常多类似的组件,所以就打算做了这样一个开源项目,目的是整合一些Android开发经常使用的组件Demo,方便以后项目中直接拿来用。git地址:https://github.com/JayFang1993/AndroidUtil

废话不多说,首先讲第一个经常使用的组件TabHost的实现。之前我们能够通过继承TabActivity来实现,后来的API中已经不建议用这样的方式了,所以今天我们主要讲的是用Fragment来实现Tabhost。


在新浪微博等非常多APP中都有底部选项卡TabHost。

首先看下实现后的效果。

开源项目AndroidUtil-採用Fragment实现TabHost

一、TabHost的实现

Tabhost的每个选项卡是通过RadioGroup实现的,每个Tab就是一个RadioButton。

页面除TabHost以外的内容区域是Fragment。

以下是详细的布局文件main.xml

每个Tab的样式:宽度、高度、背景图片这些都是同样的。所以写在了一个style文件里。styles.xml

为了可以制造出Tab按下选中的效果,所以为Tab的背景设计了一个selector。tabhost_bg_selector.xml

至此,关于TabHost的全部布局文件都写完了。

以下看看Activity中的Java代码。

MainActivity.java

public class MainActivity extends FragmentActivity {
    private FragmentManager fragmentManager;  
    private RadioGroup radioGroup;
    private RadioButton rb1;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	    fragmentManager = getSupportFragmentManager();      
	    radioGroup = (RadioGroup) findViewById(R.id.main_radio);  
	    rb1=(RadioButton) findViewById(R.id.rb_home);
	    radioGroup.setOnCheckedChangeListener(new RadioGroup.OnCheckedChangeListener() {  
	        @SuppressLint("NewApi")
		public void onCheckedChanged(RadioGroup group, int checkedId) { 
        	    rb1.setBackgroundDrawable(getResources().getDrawable(R.drawable.tabhost_bg_selector));
	            FragmentTransaction transaction = fragmentManager.beginTransaction();  
	            ContentFrame fragment = null;
	            switch(checkedId)
	            {
	            	case 0:
	            		fragment= new ContentFrame();
	            		break;
	            	case 1:
	            		fragment= new ContentFrame();
	            		break;
	            	case 2:
	            		fragment= new ContentFrame();
	            		break;
	            	case 3:
	            		fragment= new ContentFrame();
	            		break;	
	            	default:
	            		fragment= new ContentFrame();
	            		break;
	            }
	            transaction.replace(R.id.content, (Fragment)fragment);  
	            transaction.commit();  
	        }
	    });
	    //设置默认选中第一项
	    radioGroup.check(1);
	    radioGroup.check(0);
	    //设置按下的背景效果
	    rb1.setBackgroundDrawable(getResources().getDrawable(R.drawable.tabhost_press));
	}
}

针对每个选项卡的内容界面代码,随便写一个布局文件content.xml

内容部分的Java代码,实现和Activity几乎相同。只是这里须要继承Fragment而不是Activity。

从content.xml中得到一个View。然后将这个View替换Main中的Fragment部分。

public class ContentFrame extends Fragment{
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.content, null);
        TextView textView = (TextView) view.findViewById(R.id.content);
        textView.setText("Hello world");
        return view;
    }
}

 补充:以上代码是考虑到Android 3.0曾经API中没有Fragment。导入android-support-v4.jar后的代码,有几点差别:

  1. 3.0之前的应该导入  import android.support.v4.app.*; 这个包中Fragment相关类;3.o之后的能够直接导入android.app.*;
  2. 3.0之前的MainAcitivity要继承自FragmentActivity。3.0之后的直接继承自Activity;
  3. 3.0之前   fragmentManager = getSupportFragmentManager();3.0之后  fragmentManager = getFragmentManager();
 欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/