首页 > 代码库 > Fragment 点点滴滴

Fragment 点点滴滴

对于要重用资源,节约代码量,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. 避免非静态的内部类,尽量使用静态类,避免生命周期问题,注意内部类对外部对象引用导致的生命周期变化




Fragment 点点滴滴