編輯:關於Android編程
在Android應用開發:Fragment的非中斷保存setRetaineInstance一文中已經介紹過了如何讓Fragment不隨著Activity銷毀從而保存數據的方法。在移動應用程序的架構設計中,界面與數據即不可分割又不可混淆。在絕大部分的開發經歷中,我們都是使用Fragment來進行界面編程,即使保存數據基本上也只是界面相關控件的數據,很少做其他的數據保存,畢竟這樣與開發原則相背,而今天這一篇博客就要來介紹一下Fragment的另類用法,只是用來保存數據而沒有任何界面元素。
對於Fragment的數據保存方法,不難想到還是與setRetainInstance有關系的。這樣一來所處的背景也是在屏幕旋轉或其他配置改變時需要用到。無論在開發中我們的界面是用Activity還是Fragment生成的,在屏幕發生旋轉時,都會在生命周期onSaveInstanceState中做控件狀態和必要數據的緩存工作。通常情況下,會用到Bundle來存儲數據。如Bundle的官方介紹所說,Bundle是一個用來存儲String及其他序列化數據類型的map。同樣Android中也存在著這樣的一個異常:http://developer.android.com/intl/zh-cn/reference/android/os/TransactionTooLargeException.html
這個異常從字面上看不難理解,是傳輸數據過大異常。在描述中可知,現行Android系統中對於應用程序的傳輸數據大小限制在1Mb以內。所以如果在屏幕旋轉過程中使用Bundle緩存大數據並不是十分安全的。這樣的大數據在Android中很經典的代表之一就是Bitmap,即使Bitmap已經是序列化數據,能夠方便的使用Bundle作為緩存媒介,但是筆者還是強烈不建議這樣做。下邊,就提供一個簡單的解決途徑。
首先,創建一個用來保存數據的Fragment:
public class BitmapDataFragment extends Fragment { public static final String TAG = "bitmapsaver"; private Bitmap bitmap; private BitmapDataFragment(Bitmap bitmap) { this.bitmap = bitmap; } public static BitmapDataFragment newInstance(Bitmap bitmap) { return new BitmapDataFragment(bitmap); } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setRetainInstance(true); } public Bitmap getData() { return bitmap; } }
創建完成後,實踐一下使用過程,假設其使用者是Activity:
@Override protected void onSaveInstanceState(Bundle outState) { if (mBitmap != null) { getSupportFragmentManager().beginTransaction() .add(BitmapDataFragment.newInstance(mBitmap), BitmapDataFragment.TAG) .commit(); outState.putBoolean(SENSE_IMAGE_KEY, true); } else { outState.putBoolean(SENSE_IMAGE_KEY, false); } super.onSaveInstanceState(outState); }
在恢復時候,Activity的生命周期走到了onCreate()中,在這裡我們可以通過檢測Bundle參數來確定是否有Bitmap數據待取:
if (savedInstanceState.getBoolean(SENSE_IMAGE_KEY)) { BitmapDataFragment fragment = (BitmapDataFragment) getSupportFragmentManager() .findFragmentByTag(BitmapDataFragment.TAG); bitmap = fragment.getData(); getSupportFragmentManager().beginTransaction().remove(fragment).commit(); }
很簡單的Fragment非主流用法,相比直接使用Bundle保存數據確實是復雜了些,但是能夠更安全的進行數據轉移對應用來說還是很好的一件事。推薦指數五顆星★★★★★!
插值器類 xml屬性值 說明 LinearInterpolator @android:anim/linear_interpolatorr 動畫以均勻的速度改
本文所需要實現的就是這樣一種有逼格的效果:右上角加了個圖片框,按下確定可以裁剪正方形區域裡的圖片並顯示在右上角。實現思路:1:首先需要自定義一個ZoomImageView
AnimationListener聽名字就知道是對Animation設置監聽器,說簡單點就是在Animation動畫效果開始執行前,執行完畢和重復執行時可以觸發監聽器,從
今天我們來講解一下如何創建及調用自己的ContentProvider。在前面兩篇文章中我們分別講了如何讀寫聯系人和短消息,相信大家對於ContentProvider的操作