RadioGroup+ViewPager+Activity实现选项卡功能,真正回收资源

网上有很多实现选项卡的代码,各种方法都有。

有些使用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) {
        }

	}
}

效果图



详细项目代码:

http://download.csdn.net/detail/zhengjingle/9447005

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值