package com.todayinfo.ui.activity; import java.io.IOException; import java.util.ArrayList; import java.util.List; import android.support.v4.app.Fragment; import android.support.v4.app.FragmentActivity; import android.support.v4.app.FragmentManager; import android.support.v4.app.FragmentTransaction; import android.text.TextUtils; import android.util.Log; import android.view.KeyEvent; import android.view.View; import android.widget.ImageView; import com.jinghua.todayinformation.R; import com.todayinfo.event.EventCloseFM; import com.todayinfo.event.EventOpenFM; import com.todayinfo.model.Info; import com.todayinfo.ui.api.BackBan; import com.todayinfo.ui.api.IBackEventStrategy; import com.todayinfo.ui.api.IKeyEventStrategy; import com.todayinfo.ui.fragment.HotsNewFragment; import com.todayinfo.ui.fragment.PhonePhotoFragment; import com.todayinfo.ui.fragment.PhoneTechFragment; import com.todayinfo.ui.fragment.SuperFragment; import com.todayinfo.utils.CloneUtils; import de.greenrobot.event.EventBus; /** * HomeActivity的业务封装 * * @author zhou.ni 2015年4月6日 */ public class HomeController { private static final String TAG = "HomeController"; /** 一级fragment容器 **/ public static Fragment[] fragments; /** tab iv控件 **/ public static ImageView[] imageViews; /** 图片的资源id **/ private int[] imgIds = new int[] { R.raw.phone_press, R.raw.news_press, R.raw.girl_press}; /** 做标签,记录当前是哪个fragment */ public int MARK = 0; /** 二级容器fragment的层次关系 **/ private List<List<Fragment>> containerFms ; private FragmentActivity mActivity; public HomeController(FragmentActivity act) { mActivity = act; EventBus.getDefault().register(this); initFragment(); initFoot(); } public void onResume() { } public void onPause() { } public void tabOnclick(View v) { resetTab(); switch (v.getId()) { case R.id.home_phone_iv: handlTabClick(0); break; case R.id.home_news_iv: handlTabClick(1); break; case R.id.home_girl_iv: handlTabClick(2); break; default: break; } } /** 处理下方导航item的点击事件 **/ private void handlTabClick(int position) { FragmentTransaction transaction = mActivity.getSupportFragmentManager().beginTransaction(); Fragment showFm; showFm = fragments[position]; // transaction.hide(fragments[0]).hide(fragments[1]).hide(fragments[2]).hide(fragments[3]); hideFragment(transaction, fragments[MARK]); showFragment(showFm, transaction); transaction.commitAllowingStateLoss(); imageViews[position].setImageResource(imgIds[position]); MARK = position; } /** 初始化fragment */ public void initFragment() { containerFms = new ArrayList<List<Fragment>>(); containerFms.add(new ArrayList<Fragment>()); containerFms.add(new ArrayList<Fragment>()); containerFms.add(new ArrayList<Fragment>()); fragments = new Fragment[3]; fragments[0] = new PhoneTechFragment(); fragments[1] = new HotsNewFragment(); fragments[2] = new PhonePhotoFragment(); FragmentManager manager = mActivity.getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); transaction.add(R.id.home_basiceFm_container, fragments[0], fragments[0].getClass().getName()); transaction.add(R.id.home_basiceFm_container, fragments[1], fragments[1].getClass().getName()); transaction.add(R.id.home_basiceFm_container, fragments[2], fragments[2].getClass().getName()); transaction.hide(fragments[1]); transaction.hide(fragments[2]); showFragment(fragments[0], transaction); transaction.commitAllowingStateLoss(); } /** 重置下面导航 */ public void resetTab() { imageViews[0].setImageResource(R.raw.phone_normal); imageViews[1].setImageResource(R.raw.news_normal); imageViews[2].setImageResource(R.raw.girl_normal); } /** 初始化下面导航 */ public void initFoot() { imageViews = new ImageView[3]; imageViews[0] = (ImageView) mActivity.findViewById(R.id.home_phone_iv); imageViews[1] = (ImageView) mActivity.findViewById(R.id.home_news_iv); imageViews[2] = (ImageView) mActivity.findViewById(R.id.home_girl_iv); imageViews[0].setImageResource(R.raw.phone_press); imageViews[1].setImageResource(R.raw.news_normal); imageViews[2].setImageResource(R.raw.girl_normal); } /** * 显示fragment的统一入口 * @param fragment * @param transaction */ private void showFragment(Fragment fragment, FragmentTransaction transaction) { transaction.show(fragment); } /** * 隐藏fragment的统一入口 便于事件统计 * @param transaction * @param fragment */ private void hideFragment(FragmentTransaction transaction, Fragment fragment) { transaction.hide(fragment); } /** * 移除fragment的统一入口 便于事件统计 * @param transaction * @param fragment */ private void removeFragment(FragmentTransaction transaction, Fragment fragment) { transaction.remove(fragment); } /** * 回退到上一个FM */ public boolean backFm() { List<Fragment> list = containerFms.get(MARK);// 拿到当前页面的层次关系 int size = list.size(); if (size == 0) { return false; } Fragment fragment = list.get(size - 1); if( fragment instanceof IBackEventStrategy ){ //自行对返回按钮事件进行处理,不交给上层处理 boolean operate = new BackEventHandler((IBackEventStrategy) fragment).operate(); if( operate ){ return true; } } FragmentManager manager = mActivity.getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); hideFragment(transaction, fragment); list.remove(fragment); size = list.size(); if (size > 0) { // 如果当前层次还有其他Fm,则显示顶层的FM Fragment fm = list.get(size - 1); //判断是否是查询状态Fragment,是则返回底层页面 if( fm instanceof BackBan ){ transaction.commitAllowingStateLoss(); destoryFmStack(); return true; }else{ String showTag = fm.getClass().getName(); Fragment showFm = manager.findFragmentByTag(showTag); if (showFm == null) { showFm = fm; transaction.add(R.id.home_fm_container, showFm, showFm.getClass().getName()); } showFragment(showFm, transaction); } } else { // 当前层次没有其他Fm showFragment(fragments[MARK], transaction); } transaction.commitAllowingStateLoss(); return true; } /** * 处理软键盘事件 * @param event * @return */ public boolean handleKeyEvent(KeyEvent event) { List<Fragment> list = containerFms.get(MARK);// 拿到当前页面的层次关系 int size = list.size(); if (size == 0) { return false; } Fragment fragment = list.get(size - 1); if( fragment instanceof IKeyEventStrategy ){ //自行对返回按钮事件进行处理,不交给上层处理 boolean operate = new KeyEventHandler((IKeyEventStrategy) fragment).operate(event); if( operate ){ return true; } } return false; } /** * 锦囊 用于实施策略,处理软键盘按钮事件 * * @author longtao.li * */ class KeyEventHandler { IKeyEventStrategy strategy; public KeyEventHandler(IKeyEventStrategy strategy) { this.strategy = strategy; } public boolean operate(KeyEvent event) { return strategy.eventOperate(event); } } /** * 锦囊 用于实施策略,处理硬件返回按钮事件 * * @author longtao.li * */ class BackEventHandler { IBackEventStrategy strategy; public BackEventHandler(IBackEventStrategy strategy) { this.strategy = strategy; } public boolean operate() { return strategy.backOperate(); } } /** * 隐藏当前的fragment层级,并显示底层fm */ private void destoryFmStack() { FragmentManager manager = mActivity.getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); List<Fragment> list = containerFms.get(MARK);// 拿到当前页面的层次关系 for(Fragment fm : list){ Fragment fragment = manager.findFragmentByTag(fm.getClass().getName()); if (fragment != null) { hideFragment(transaction, fragment); } } list.clear(); showFragment(fragments[MARK], transaction); transaction.commitAllowingStateLoss(); } /** * 收到打开FM的事件 * * @param event */ public void onEvent(EventOpenFM event) { if (event == null || event.getClazz() == null) return; Info bean = event.getInfo(); Class<Fragment> clazz = event.getClazz(); String tag = clazz.getName(); for( int i=0;i<fragments.length;i++ ){ boolean equals = TextUtils.equals(fragments[i].getClass().getName(), tag); if( equals ){//如果要显示最底层的3个FM之一 destoryFmStack();//隐藏当前层级 resetTab(); handlTabClick(i); ((SuperFragment) fragments[i]).receiveInfo(bean); return; } } if( event.isDestoryAll() ){ _destoryFmStack();//隐藏当前层级 } //显示非底层fragment showOtherFm(event); } /** * 隐藏当前的fragment层级 */ private void _destoryFmStack() { FragmentManager manager = mActivity.getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); List<Fragment> list = containerFms.get(MARK);// 拿到当前页面的层次关系 for(Fragment fm : list){ Fragment fragment = manager.findFragmentByTag(fm.getClass().getName()); if (fragment != null) { hideFragment(transaction, fragment); } } list.clear(); transaction.commitAllowingStateLoss(); } /** * 显示非底层fragment * @param bean * @param clazz * @param tag */ private void showOtherFm(EventOpenFM event) { //深度克隆数据 Info bean = null; try { bean = (Info) CloneUtils.copy((Info) event.getInfo()); } catch (ClassNotFoundException e1) { Log.e(TAG, "uncaughtException crash", e1); } catch (IOException e1) { Log.e(TAG, "uncaughtException crash", e1); } Class<Fragment> clazz = event.getClazz(); boolean transparent = event.isTransparent(); String tag = clazz.getName(); FragmentManager manager = mActivity.getSupportFragmentManager(); Fragment fragment = manager.findFragmentByTag(tag); FragmentTransaction transaction = manager.beginTransaction(); if (fragment == null) { try { fragment = clazz.newInstance();// 反射得到Fragment实例 } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } transaction.add(R.id.home_fm_container, fragment, tag); } List<Fragment> list = containerFms.get(MARK);// 当前tab的层次关系 int size = list.size(); if (size > 0 && !transparent) { //隐藏所有fm for( Fragment fm : list ){ hideFragment(transaction, fm); } } ((SuperFragment) fragment).receiveInfo(bean); // 接收要传递的数据 if (!list.contains(fragment)) { //将已经显示的fm加入到层级结构中 Log.i(TAG, "打开"+ fragment.getClass().getName()); list.add(fragment); } showFragment(fragment, transaction); transaction.commitAllowingStateLoss(); } /** * 收到关闭FM的事件 * * @param event */ public void onEvent(EventCloseFM event) { if (event == null || event.getClazz() == null) return; Info bean = event.getInfo(); Class<Fragment> clazz = event.getClazz(); boolean isDestory = event.isDestory(); boolean isDestoryAll = event.isDestoryAll(); String tag = clazz.getName(); if( isDestoryAll ){ destoryFmStack(); }else{ handleEventClose(bean, isDestory, tag); } System.gc(); } /** * 处理普通的关闭事件 * @param bean * @param isDestory * @param tag */ private void handleEventClose(Info bean, boolean isDestory, String tag) { FragmentManager manager = mActivity.getSupportFragmentManager(); FragmentTransaction transaction = manager.beginTransaction(); List<Fragment> list = containerFms.get(MARK);// 拿到当前页面的层次关系 Fragment fragment = manager.findFragmentByTag(tag); if (fragment != null) { if( isDestory ){ //隐藏fragment hideFragment(transaction, fragment); }else{ hideFragment(transaction, fragment); } if (list.contains(fragment)) { list.remove(fragment); } int size = list.size(); if (size > 0) { Fragment fm = list.get(size - 1); //判断是否是查询状态Fragment,是则返回底层页面 if( fm instanceof BackBan ){ transaction.commitAllowingStateLoss(); destoryFmStack(); return ; } String showTag = fm.getClass().getName(); Fragment showFm = manager.findFragmentByTag(showTag); if (showFm == null) { showFm = fm; transaction.add(R.id.home_fm_container, showFm, showFm.getClass().getName()); } ((SuperFragment) showFm).receiveInfo(bean); // 接收要传递的数据 showFragment(showFm, transaction); } else { ((SuperFragment) fragments[MARK]).receiveInfo(bean); // 接收要传递的数据 showFragment(fragments[MARK], transaction); } transaction.commitAllowingStateLoss(); } } /** * 打开一个Fragment * * @param clazz * @param info */ public void openFragment(final Class clazz, final Info info) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { EventOpenFM event = new EventOpenFM(); event.setClazz(clazz); event.setInfo(info); EventBus.getDefault().post(event); } }); } /** * 关闭一个Fragment * * @param clazz * @param info */ public void closeFragment(final Class clazz, final Info info) { mActivity.runOnUiThread(new Runnable() { @Override public void run() { EventCloseFM event = new EventCloseFM(); event.setClazz(clazz); event.setInfo(info); EventBus.getDefault().post(event); } }); } }