RadioGroup+ViewPager+Activity实现选项卡功能,真正回收资源
2016-02-28 19:36
495 查看
网上有很多实现选项卡的代码,各种方法都有。
有些使用TabHost的,但我觉得设置TabHost的标签有些复杂,而且不能像ViewPager那样滑动。
有些使用Fragment的,但Fragment的实际生命周期有些复杂,网上已有人指出。
而且他们使用的ViewPager,大多用List<View>引用页面,虽然他们ViewPager的adapter里有回收,但List<View>还是引用着页面的,未真正回收资源。
我这里就用RadioGroup实现标签,用ViewPager实现内容页,使用Activity回收机制。
主布局的xml代码,仅在这里,RadioGroup就可以实现大部分标签功能
主界面代码
效果图
详细项目代码:
http://download.csdn.net/detail/zhengjingle/9447005
有些使用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
相关文章推荐
- 自定义ImageView
- 高数试题与答案
- 测试必备技能系列6:软件安装部署是最基本的能力!
- Java入门(二)——果然断更的都是要受惩罚的。。。
- OSI的七层模型介绍
- android学习之实现动态自动匹配输入
- “笨办法学python”学习笔记-在终端powershell中对目录进行简单的编辑(一)
- [iOS]防止数组越界及添加空值的crash的扩展
- leetcode随笔III
- [MEMO] Linux Kernel Debugging Training 琐碎(补充ing)
- Loadrunner重要概念——参数化
- UVA 11300(p4)----Spreading the Wealth
- 高数试题与答案
- CSU 1646: HearthStone
- hdoj Clarke and MST 5627(求位运算and后得到的最大生成树)(并查集&位运算)好题
- Python 数据库备份脚本(邮件通知+日志记录)
- UVA 11292(p1)----The Dragon of Loowater
- 回声消除技术(1)
- 部分数学课件
- Eclipse汉化后怎么改回英文版(可切换中英文)