开源项目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。
首先看下实现后的效果。
一、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后的代码,有几点差别:
- 3.0之前的应该导入 import android.support.v4.app.*; 这个包中Fragment相关类;3.o之后的能够直接导入android.app.*;
- 3.0之前的MainAcitivity要继承自FragmentActivity。3.0之后的直接继承自Activity;
- 3.0之前 fragmentManager = getSupportFragmentManager();3.0之后 fragmentManager = getFragmentManager();
欢迎各位关注我的个人网站:http://fangjie.sinaapp.com/