网上有很多实现选项卡的代码,各种方法都有。
有些使用TabHost的,但我觉得设置TabHost的标签有些复杂,而且不能像ViewPager那样滑动。
有些使用Fragment的,但Fragment的实际生命周期有些复杂,网上已有人指出。
而且他们使用的ViewPager,大多用List<View>引用页面,虽然他们ViewPager的adapter里有回收,但List<View>还是引用着页面的,未真正回收资源。
我这里就用RadioGroup实现标签,用ViewPager实现内容页,使用Activity回收机制。
主布局的xml代码,仅在这里,RadioGroup就可以实现大部分标签功能
<?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" >
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="50dp"
android:orientation="horizontal" >
<RadioButton
android:id="@+id/radio_home"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_gravity="center"
android:layout_weight="1"
android:background="@drawable/selector_tab_bg"
android:button="@null"
android:checked="true"
android:drawablePadding="-5dp"
android:drawableTop="@drawable/selector_tab_home"
android:gravity="center"
android:paddingTop="3dp"
android:text="@string/home"
android:textColor="@drawable/selector_tab_text_color"
android:textSize="16sp" />
<RadioButton
android:id="@+id/radio_task"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/selector_tab_bg"
android:button="@null"
android:drawablePadding="-5dp"
android:drawableTop="@drawable/selector_tab_task"
android:gravity="center"
android:paddingTop="3dp"
android:text="@string/task"
android:textColor="@drawable/selector_tab_text_color"
android:textSize="16sp" />
<RadioButton
android:id="@+id/radio_record"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/selector_tab_bg"
android:button="@null"
android:drawablePadding="-5dp"
android:drawableTop="@drawable/selector_tab_record"
android:gravity="center"
android:paddingTop="3dp"
android:text="@string/record"
android:textColor="@drawable/selector_tab_text_color"
android:textSize="16sp" />
<RadioButton
android:id="@+id/radio_profile"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/selector_tab_bg"
android:button="@null"
android:drawablePadding="-5dp"
android:drawableTop="@drawable/selector_tab_profile"
android:gravity="center"
android:paddingTop="3dp"
android:text="@string/profile"
android:textColor="@drawable/selector_tab_text_color"
android:textSize="16sp" />
<RadioButton
android:id="@+id/radio_more"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:background="@drawable/selector_tab_bg"
android:button="@null"
android:drawablePadding="-5dp"
android:drawableTop="@drawable/selector_tab_more"
android:gravity="center"
android:paddingTop="3dp"
android:text="@string/more"
android:textColor="@drawable/selector_tab_text_color"
android:textSize="16sp" />
</RadioGroup>
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
package com.activity;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import android.app.Activity;
import android.app.LocalActivityManager;
import android.content.Intent;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.ViewGroup;
import android.widget.RadioGroup;
import android.widget.RadioGroup.OnCheckedChangeListener;
@SuppressWarnings("deprecation")
public class MainActivity extends Activity {
List<Intent> intentList;
LocalActivityManager activityManager;
String[] tabIds={"home","task","record","profile","more"};
private RadioGroup radioGroup;
private ViewPager viewpager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//activity页
activityManager=new LocalActivityManager(this,true);
activityManager.dispatchCreate(savedInstanceState);
intentList=new LinkedList<Intent>();
Intent homeIntent=new Intent(this,HomeActivity.class);
intentList.add(homeIntent);
Intent taskIntent=new Intent(this,TaskActivity.class);
intentList.add(taskIntent);
Intent recordIntent=new Intent(this,RecordActivity.class);
intentList.add(recordIntent);
Intent profileIntent=new Intent(this,ProfileActivity.class);
intentList.add(profileIntent);
Intent moreIntent=new Intent(this,MoreActivity.class);
intentList.add(moreIntent);
//设置radioGroup
radioGroup=(RadioGroup)findViewById(R.id.radioGroup);
radioGroup.setOnCheckedChangeListener(new OnCheckedChangeListener(){
@Override
public void onCheckedChanged(RadioGroup arg0, int checkedId) {
// TODO 自动生成的方法存根
switch (checkedId) {
case R.id.radio_home:
viewpager.setCurrentItem(0);
break;
case R.id.radio_task:
viewpager.setCurrentItem(1);
break;
case R.id.radio_record:
viewpager.setCurrentItem(2);
break;
case R.id.radio_profile:
viewpager.setCurrentItem(3);
break;
case R.id.radio_more:
viewpager.setCurrentItem(4);
break;
}
}
});
//设置viewpager
viewpager=(ViewPager)findViewById(R.id.viewpager);
viewpager.setAdapter(new MyPageAdapter());
viewpager.setOnPageChangeListener(new OnPageChangeListener(){
@Override
public void onPageScrollStateChanged(int position) {
// TODO 自动生成的方法存根
}
@Override
public void onPageScrolled(int arg0, float arg1, int arg2) {
// TODO 自动生成的方法存根
}
@Override
public void onPageSelected(int position) {
// TODO 自动生成的方法存根
switch(position){
case 0:
radioGroup.check(R.id.radio_home);
break;
case 1:
radioGroup.check(R.id.radio_task);
break;
case 2:
radioGroup.check(R.id.radio_record);
break;
case 3:
radioGroup.check(R.id.radio_profile);
break;
case 4:
radioGroup.check(R.id.radio_more);
break;
}
}
});
}
protected void onResume(){
super.onResume();
activityManager.dispatchResume();
}
protected void onPause(){
super.onPause();
activityManager.dispatchPause(isFinishing());
}
protected void onStop(){
super.onStop();
activityManager.dispatchStop();
}
protected void onDestory(){
super.onDestroy();
activityManager.dispatchDestroy(isFinishing());
}
private class MyPageAdapter extends PagerAdapter {
//临时保存view
HashMap<String,View> idViewMap;
public MyPageAdapter(){
idViewMap=new HashMap<String,View>();
}
public int getItemPosition(Object object) {
// TODO Auto-generated method stub
return POSITION_NONE;
}
@Override
public void destroyItem(View view, int position, Object arg2) {
ViewPager viewPager = ((ViewPager) view);
View tabView=idViewMap.get(tabIds[position]);
viewPager.removeView(tabView);//移除viewPager中的view
activityManager.destroyActivity(tabIds[position], true);//销毁activity
idViewMap.remove(tabIds[position]);//移除idViewMap中的引用
}
@Override
public void finishUpdate(View arg0) {
}
@Override
public int getCount() {
return intentList.size();
}
@Override
public Object instantiateItem(View view, int position) {
ViewPager viewPager = ((ViewPager) view);
View tabView=idViewMap.get(tabIds[position]);//先向idViewMap获取,看有没有
if(tabView==null){//没有就新创建一个
tabView=activityManager.startActivity(tabIds[position], intentList.get(position)).getDecorView();
idViewMap.put(tabIds[position], tabView);
}else{//检查是否已加入到某个parent view中
ViewGroup tabViewParent = (ViewGroup) tabView.getParent();
if (tabViewParent != null) {
tabViewParent.removeAllViewsInLayout();
}
}
viewPager.addView(tabView);
return tabView;
}
@Override
public boolean isViewFromObject(View arg0, Object arg1) {
return arg0 == arg1;
}
@Override
public void restoreState(Parcelable arg0, ClassLoader arg1) {
}
@Override
public Parcelable saveState() {
return null;
}
@Override
public void startUpdate(View arg0) {
}
}
}
效果图
详细项目代码: