Fragment
Fragment 是安卓在3.0后推出的。有人说它是轻量级activity, 虽然不大贴切但是是有点这么个意思的。
Fragment 的生命期
结合activity 进行了类比。采用打log的方式,跟踪着执行顺序。其中蓝色线为activity的声明期。没有画入 被意外杀死的情况。
viso画的图转换为jpg失真了些:
操作流程
1、静态fragment:
在一个Activity布局(xml)中画一个Fragment,指定对应的类。在该类中重写onCreateView()
2、动态fragment:
在Activity布局(xml)中 放置一个View容器,比如各种layout。 重复第1种的操作。通过FragmentTransaction 的api实现各个Fragment切换的在同一个容器中显示
添加容器:
<FrameLayout
android:id="@+id/frameLayout1"
android:layout_width="match_parent"
android:layout_height="241dp"
android:layout_weight="1.18">
</FrameLayout>
动态切换:
protected void add()
{
Fragment newFragment = new Fragment1(); //及第一步的Fragment1
FragmentManager fm =getFragmentManager();
FragmentTransaction ft = fm.beginTransaction(); //每次都要获取一次
ft.replace(R.id.frameLayout1, newFragment);
ft.commit();
}
3 交互
Activity 与 Fragment 之间的交互。
1、activity 中可以getFragmentManager。
2、Fragment 中可以getactivity()获取activity的实例,供需要context的地方使用
3、Fragment 切换时可以携带参数的。
切换前: mFragment.setArguments(mBundle);
切换后:getArguments().getString("key");
4、activity中获得插入xml的fragment
com.rockerhieu.emojicon.EmojiconsFragment fragment = (EmojiconsFragment) getSupportFragmentManager().findFragmentById(R.id.emojicons);
fragment.setBackGround(Color.TRANSPARENT);
fragment 插入xml中
<fragment
android:id="@+id/emojicons"
android:layout_width="match_parent"
android:layout_height="180dp"
class="com.rockerhieu.emojicon.EmojiconsFragment"/>
可以用class 也可以用android:name
<fragmentandroid:name="com.example.news.ArticleReaderFragment"
4、其它
4.1 关于销毁与恢复
最近做关于fragment的切换,与层叠。发现对于fragment的部分属性还是没有理解深
看到:http://blog.csdn.net/lmj623565791/article/details/37970961
这个博客写的挺详细验证了下里面指出的:
detach() 将此Fragment从Activity中分离,会销毁其布局,但不会销毁该实例
attach() 将从Activity中分离的Fragment,重新关联到该Activity,重新创建其视图层次
简单的说就是detach后attach会重新调用onCreateView
detach() attach()是销毁试图保留实例
而hide(), show()方法则是纯粹的隐藏
remove 和replace则是纯粹的new一个实例
4.2 关于setUserVisibleHint函数。
@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
//isVisibleToUser = true 是显示,false是不显示
}
这个函数的使用是比较奇怪的,set开头但是却可以直接重写获取状态(再viewGroup内的fragment这个函数是可以监听到当前的fragment是否显示在手机前端的,对于不是在viewGroup 中的fragment这个函数是不会调用的,比如单独的一个activity里放一个单独的fragment验证过的),还有人直接去调用该函数的fragment.setUserVisibleHint(true); fragment.setUserVisibleHint(false);按字面理解这种调用才是set开头函数是这么用的,在ViewGroup内部切换fragment的时通过在该函数可以钳住viewGroup的预加载(虽然我认为既然用了viewGroup就是应该有加载才顺畅)