zoukankan      html  css  js  c++  java
  • FragmentHelper

      1 package com.icitymobile.anda.util;
      2 
      3 import java.lang.ref.SoftReference;
      4 import java.util.ArrayList;
      5 import java.util.HashMap;
      6 import java.util.Iterator;
      7 import java.util.Map;
      8 import java.util.Map.Entry;
      9 
     10 import android.content.Context;
     11 import android.content.Intent;
     12 import android.os.Bundle;
     13 import android.support.v4.app.Fragment;
     14 import android.support.v4.app.FragmentManager;
     15 import android.support.v4.app.FragmentTransaction;
     16 
     17 import com.hualong.framework.log.Logger;
     18 
     19 /**
     20  * Fragment帮助类
     21  */
     22 public class FragmentHelper {
     23 
     24     public static final String TAG = "FragmentHelper";
     25 
     26     private static final String STATE_IDS = "fragment_ids";
     27     private static final String STATE_CURRENT_FRAGMENT_ID = "current_fragment_id";
     28     private static final String STATE_LAST_FRAGMENT = "last_fragment";
     29 
     30     private Context mContext;
     31     private FragmentManager mManager;
     32     private int mContainerId;
     33 
     34     private Map<String, SoftReference<Fragment>> mFragments = new HashMap<String, SoftReference<Fragment>>();
     35     private String mCurrentFragmentId = null;
     36     private Fragment mLastFragment;
     37 
     38     public FragmentHelper(Context context, FragmentManager manager, int containerId) {
     39         mContext = context;
     40         mManager = manager;
     41         mContainerId = containerId;
     42     }
     43 
     44     public Fragment getFragment(String fragmentId) {
     45         Fragment fragment = null;
     46         SoftReference<Fragment> reference = mFragments.get(fragmentId);
     47         if (reference != null) {
     48             fragment = reference.get();
     49         }
     50         return fragment;
     51     }
     52 
     53     public String getCurrentFragmentId() {
     54         return mCurrentFragmentId;
     55     }
     56 
     57     public Fragment getCurrentFragment() {
     58         return getFragment(getCurrentFragmentId());
     59     }
     60 
     61     public void switchFragment(String id, Intent intent) {
     62         switchFragment(id, intent, -1);
     63     }
     64 
     65     public void switchFragment(String id, Intent intent, int transition) {
     66         if (intent == null) {
     67             return;
     68         }
     69         Fragment newFragment = getFragment(id);
     70         if (mLastFragment == null || mLastFragment != newFragment) {
     71             FragmentTransaction ft = mManager.beginTransaction();
     72             if (mLastFragment != null) {
     73                 ft.hide(mLastFragment);
     74             }
     75             if (newFragment == null) {
     76                 Logger.i(TAG, TAG + ": Instantiate a new fragment " + id);
     77                 String fname = intent.getComponent().getClassName();
     78                 Bundle args = intent.getExtras();
     79                 newFragment = Fragment.instantiate(mContext, fname);
     80                 if (args != null) {
     81                     newFragment.setArguments(args);
     82                 }
     83                 mFragments.put(id, new SoftReference<Fragment>(newFragment));
     84                 ft.add(mContainerId, newFragment, id);
     85             } else {
     86                 Logger.i(TAG, TAG + ": Load an old fragment " + id);
     87                 ft.show(newFragment);
     88             }
     89             if (transition != -1) {
     90                 ft.setTransition(transition);
     91             }
     92             mLastFragment = newFragment;
     93             mCurrentFragmentId = id;
     94             ft.commit();
     95 //            mManager.executePendingTransactions();
     96         }
     97     }
     98 
     99     /**
    100      * 在Bundle中保存状态
    101      *
    102      * @param bundle
    103      */
    104     public void saveInBundle(Bundle bundle) {
    105         if (bundle == null) {
    106             return;
    107         }
    108         Logger.i(TAG, TAG + ": saving in bundle");
    109         ArrayList<String> idList = new ArrayList<String>(mFragments.keySet());
    110         bundle.putStringArrayList(STATE_IDS, idList);
    111 
    112         Iterator<Entry<String, SoftReference<Fragment>>> iter = mFragments.entrySet().iterator();
    113         Entry<String, SoftReference<Fragment>> entry;
    114         SoftReference<Fragment> reference;
    115         Fragment fragment;
    116         while (iter.hasNext()) {
    117             entry = iter.next();
    118             reference = entry.getValue();
    119             if (reference != null) {
    120                 fragment = reference.get();
    121                 if (fragment != null) {
    122                     mManager.putFragment(bundle, entry.getKey(), fragment);
    123                 }
    124             }
    125         }
    126 
    127         if (mCurrentFragmentId != null) {
    128             bundle.putString(STATE_CURRENT_FRAGMENT_ID, mCurrentFragmentId);
    129         }
    130 
    131         if (mLastFragment != null) {
    132             mManager.putFragment(bundle, STATE_LAST_FRAGMENT, mLastFragment);
    133         }
    134     }
    135 
    136     /**
    137      * 在Bundle中保存状态,只保存当前的fragment
    138      *
    139      * @param bundle
    140      */
    141     public void saveStateSimple(Bundle bundle) {
    142         if (bundle == null) {
    143             return;
    144         }
    145         Logger.i(TAG, TAG + ": saving in bundle simple");
    146 
    147         if (mCurrentFragmentId != null) {
    148             bundle.putString(STATE_CURRENT_FRAGMENT_ID, mCurrentFragmentId);
    149 
    150             ArrayList<String> idList = new ArrayList<String>(1);
    151             idList.add(mCurrentFragmentId);
    152             bundle.putStringArrayList(STATE_IDS, idList);
    153 
    154             Fragment currentFragment = getCurrentFragment();
    155             if (currentFragment != null) {
    156                 mManager.putFragment(bundle, mCurrentFragmentId, currentFragment);
    157             }
    158         }
    159 
    160         if (mLastFragment != null) {
    161             mManager.putFragment(bundle, STATE_LAST_FRAGMENT, mLastFragment);
    162         }
    163     }
    164 
    165     /**
    166      * 从Bundle中恢复状态
    167      *
    168      * @param bundle
    169      */
    170     public void restoreFromBundle(Bundle bundle) {
    171         if (bundle == null) {
    172             return;
    173         }
    174         Logger.i(TAG, TAG + ": restoring from bundle");
    175         ArrayList<String> idList = bundle.getStringArrayList(STATE_IDS);
    176         if (idList != null) {
    177             Fragment fragment;
    178             for (String id : idList) {
    179                 fragment = mManager.getFragment(bundle, id);
    180                 if (fragment != null) {
    181                     mFragments.put(id, new SoftReference<Fragment>(fragment));
    182                 }
    183             }
    184         }
    185 
    186         String currentId = bundle.getString(STATE_CURRENT_FRAGMENT_ID);
    187         if (currentId != null) {
    188             mCurrentFragmentId = currentId;
    189         }
    190 
    191         Fragment lastFragment = mManager.getFragment(bundle, STATE_LAST_FRAGMENT);
    192         if (lastFragment != null) {
    193             mLastFragment = lastFragment;
    194         }
    195     }
    196 }
  • 相关阅读:
    golang与vscode的安装与配置
    numpy学习之前的必要数学知识:线性代数
    分布式系统设计系列 -- 基本原理及高可用策略
    微服务的4个设计原则和19个解决方案
    JAVA8 十大新特性详解
    ConcurrentHashMap总结
    Java NIO理解与使用
    深入了解 Java-Netty高性能高并发理解
    java内存泄漏的定位与分析
    Netty高性能编程备忘录(下)
  • 原文地址:https://www.cnblogs.com/jinglecode/p/5109713.html
Copyright © 2011-2022 走看看