編輯:關於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保存數據確實是復雜了些,但是能夠更安全的進行數據轉移對應用來說還是很好的一件事。推薦指數五顆星★★★★★!
Android動畫效果——1.幀動畫2.補間動畫3.跳轉畫面(三)
插值器類 xml屬性值 說明 LinearInterpolator @android:anim/linear_interpolatorr 動畫以均勻的速度改
Android自定義View實現照片裁剪框與照片裁剪功能
本文所需要實現的就是這樣一種有逼格的效果:右上角加了個圖片框,按下確定可以裁剪正方形區域裡的圖片並顯示在右上角。實現思路:1:首先需要自定義一個ZoomImageView
android Animation監聽器AnimationListener的使用方法)
AnimationListener聽名字就知道是對Animation設置監聽器,說簡單點就是在Animation動畫效果開始執行前,執行完畢和重復執行時可以觸發監聽器,從
android基礎總結篇之八:創建及調用自己的ContentProvider
今天我們來講解一下如何創建及調用自己的ContentProvider。在前面兩篇文章中我們分別講了如何讀寫聯系人和短消息,相信大家對於ContentProvider的操作