Fragment


Fragment 是安卓在3.0后推出的。有人说它是轻量级activity, 虽然不大贴切但是是有点这么个意思的。


Fragment 的生命期

结合activity 进行了类比。采用打log的方式,跟踪着执行顺序。其中蓝色线为activity的声明期。没有画入 被意外杀死的情况。

viso画的图转换为jpg失真了些:



操作流程



1、静态fragment:

在一个Activity布局(xml)中画一个Fragment,指定对应的类。在该类中重写onCreateView()

XML:
    
   
   
java:
package com.example.test;
import android.os.Bundle;
import android.app.*;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class Fragment1 extends Fragment{

	@Override
	public void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
	}
	
	@Override
	public void onStart() {
		// TODO Auto-generated method stub
		super.onStart();
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View chatView=inflater.inflate(R.layout.lay_1, container,false);
		return chatView;
	}
}

lay_1.xml:

   
   

   
   
    
    
    

   
   

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一个实例

ps:一个faq

就是fragment 在同一个位置的叠加,事件穿透问题。根据上面的分析 肯定是用了hide之后才会穿透了,用detach 是不会穿透了,可以解决的很彻底。

另外根据事件传递规则一定要用hide的话也可以强制消费掉触摸事件就ok了:

比如在fragment的最外层layout布局加上:android:clickable="true"

或者直接强制消费touch 事件,如:http://www.cnblogs.com/qixing/p/4022850.html

不过按 事件传递和消费的规则,个人认为还是直接detach 的好

4.2 关于 setUserVisibleHint函数。

@Override

publicvoid 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就是应该有加载才顺畅)


5、fragment嵌套

fragment在activity中是用的FragmentManager (v4用的getSupportFragmentManager

fragment在fragment中是用的getChildFragmentManager

在fragment里嵌套fragment也可以用FragmentManager 只是有时候会出问题

主要是嵌套的fragment有可能会空白发生在fragment里嵌套viewPager里嵌fragment,参见:http://www.apkbus.com/blog-160625-58537.html





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值