对于要重用资源,节约代码量,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. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化
原文地址:http://blog.csdn.net/kan1kan5/article/details/40098267