對于要重用資源,節約代碼量,fragment起到很好的制約作用
一 先來看看fragment的調用方式。
1.寫在布局中
比如我有一個fragme叫 DateFragment.class
第一種方法
<fragment android:name = "com.kankan.kankanstyle.fragment.DateFragment"
android:id = "@+id/datefragment"
android:layout_weight="1"
android:layout_width="0dp"
android:layout_height="match_parent"/>
在activity中直接顯示這個fragment。
2.在java代碼中,通過fragmentManager找到
DateFragment fragment = getSupportedFragmentManager().findFragmentById(R.id.dateFragment);
3.就是最常見的 new Fragment();了,這裡不說了。
二 數值傳遞
1.使用SharePrefeerence,
優點,一次存儲,多次多位置調用資料不丢失。
SharePreference sharePreference = LSharePreference.getInstance(getActivity());
寫 sharePreference.setString("QUALITY_CONDITION",mData.get(v.getId() - 3020).id + "");
讀 sharePreference.getString("QUALITY_CONDITION");
2.使用構造器傳入資料,使用public方法傳出資料
這樣寫構造器
public static final synchronized QualityConditionFragment newInstance(
String strs) {
QualityConditionFragment f = new QualityConditionFragment();
Bundle args = new Bundle();
args.putString(KEY, strs);
f.setArguments(args);
return f;
}
這裡的strs就是傳入的參數。
你在activity 中初始化fragment的時候 ,可以傳入這個資料。
怎麼取呢? 用bundle
String str = getArguments().getString("KEY");
三,顯示與隐藏
Fragment 可以直接show 與 hide ,這個比你隐藏Layout友善
fragmetn有show() 方法 還有 hide()方法
但是hide(),就是執行了onDestroy()方法,怎麼辦?
可以在重寫一下fragment的onSaveInstanceState方法 儲存一下 fragment 的 狀态 isHidden(); 然後在oncrate 判斷一下 if (savedInstanceState != null) { if (savedInstanceState.getBoolean("isHidden")) { getFragmentManager().beginTransaction().hide(this).commit(); } } |
四,在fragment中使用上下文
不用多說 用 getActivity() 而不要用getApplicationConText()
在android中有兩種context,一種是 application context,
一種是activity context,通常我們在各種類和方法間傳遞的是activity context。
當螢幕旋轉的時候,系統會銷毀目前的activity,儲存狀态資訊,再建立一個新的。
比如我們寫了一個應用程式,它需要加載一個很大的圖檔,
我們知道,螢幕旋轉時候,執行了 onPause(),,onStop(),onDestroyView(),onDestroy(),onDetach()方法
我們不希望每次旋轉螢幕的時候都銷毀這個圖檔,重新加載。實作這個要求的簡單想法就是定義一個靜态的Drawable,
這樣Activity類建立銷毀它始終儲存在記憶體中。
避免這種記憶體洩露的方法是避免activity中的任何對象的生命周期長過activity,避免由于對象對activity的引用導緻activity 不能正常被銷毀。我們可以使用application context。application context伴随application的一生,與activity的生命周期無關。application context可以通過Context.getApplicationContext或者Activity.getApplication方法擷取。
避免context相關的記憶體洩露,記住以下幾點:
1. 不要讓生命周期長的對象引用activity context,即保證引用activity的對象要與activity本身生命周期是一樣的
2. 對于生命周期長的對象,可以使用application context
3. 避免非靜态的内部類,盡量使用靜态類,避免生命周期問題,注意内部類對外部對象引用導緻的生命周期變化