Fragment,FragmentManager, FragmentTransaction详解

Fragment是3.0引入的新组件,在3.0之前需要引入v4包的Fragment进行向下兼容,在项目中会频繁用到。

先说下3.0的Fragment用法。

其中,Fragment的生命周期就不多说了,首先构建Fragment 的View对象。

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

然后在Activity中显示目标Fragment。

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fg3 = new Fragment03();
    	//获取fragment管理器
    	FragmentManager fm = getFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示至帧布局
    	ft.replace(R.id.fl, fg3);
    	//提交
    	ft.commit();
    }

需要注意的是Fragment只能替换Activity中的FrameLayout。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="horizontal"
    >

	<FrameLayout
	    android:id="@+id/fl"
	    android:layout_weight="1"
	    android:layout_width="0dp"
	    android:layout_height="match_parent"
	    ></FrameLayout>

	 <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:orientation="vertical"
        >
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment01"
            android:onClick="click1"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment02"
            android:onClick="click2"
            />
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment03"
            android:onClick="click3"
            />
    </LinearLayout>
</LinearLayout>

之后我们说下Fragment 的向下兼容模式:

首先,我们要先导入系统自带的V4包。

package com.itheima.supportfragment;

import android.os.Bundle;
import android.app.Activity;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;

public class MainActivity extends FragmentActivity {

    private Fragment03 fg3;

	@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        fg3 = new Fragment03();
    	//获取fragment管理器
    	FragmentManager fm = getSupportFragmentManager();
    	//打开事务
    	FragmentTransaction ft = fm.beginTransaction();
    	//把内容显示至帧布局
    	ft.replace(R.id.fl, fg3);
    	//提交
    	ft.commit();
    }
}

与上者使用方法大体相同,都是替换Activity中的FrameLayout布局。

最后说下Activity与Fragment之间数据的传递。

@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		View v = inflater.inflate(R.layout.fragment01, null);

		final EditText et = (EditText) v.findViewById(R.id.et);
		Button bt = (Button) v.findViewById(R.id.bt);
		bt.setOnClickListener(new OnClickListener() {

			@Override
			public void onClick(View v) {
				String text = et.getText().toString();
				//把数据传递给activity
				((MainActivity)getActivity()).setText(text);

			}
		});
		return v;
	}

Fragment向Activity传递数据时,直接调用getActivity()获取Activity的对象。

public void click4(View v){

    	String text = et_main.getText().toString();

    	//传递数据
    	fg3.setText(text);
    }

Activity向Fragment传递数据时,先new一个Fragment即可。

但是一般Fragment与Activity之间最好利用回调接口的方式进行数据传递。这样做的好处是利于Fragment的重用性。

public static class FragmentA extends ListFragment{
   ...
   //Container Activity must implement this interface
   public interface OnArticleSelectedListener{
       public void onArticleSelected(Uri articleUri);
   }
   ...
}
public static class FragmentA extends ListFragment{
   OnArticleSelectedListener mListener;
   ...
   @Override
   public void onAttach(Activity activity){
       super.onAttach(activity);
       try{
           mListener =(OnArticleSelectedListener)activity;
       }catch(ClassCastException e){
           throw new ClassCastException(activity.toString()+"must implement OnArticleSelectedListener");
       }
   }
   ...
}

如果activity没有实现那个接口,fragment抛出ClassCastException异常。如果成功了,mListener成员变量保存OnArticleSelectedListener的实例。于是fragmentA就可以调用mListener的方法来与activity共享事件。例如,如果fragmentA是一个ListFragment,每次选中列表的一项时,就会调用fragmentA的onListItemClick()方法,在这个方法中调用onArticleSelected()来与activity共享事件,如下:

public static class FragmentA extends ListFragment{
   OnArticleSelectedListener mListener;
   ...
   @Override
   public void onListItemClick(ListView l,View v,int position,long id){
       //Append the clicked item's row ID with the content provider Uri
       Uri noteUri =ContentUris.withAppendedId(ArticleColumns.CONTENT_URI,id);
       //Send the event and Uri to the host activity
       mListener.onArticleSelected(noteUri);
   }
   ...
}

FragmentManager用来管理Fragment的,利用Activity的getFragmentManager()取得它的实例.

FragmentManager可以做如下一些事情:

1、使用findFragmentById() (用于在activity layout中提供一个UI的fragment)或findFragmentByTag()(适用于有或没有UI的fragment)获取activity中存在的fragment

2、将fragment从后台堆栈中弹出, 使用 popBackStack()

3、使用addOnBackStackChangeListener()注册一个监听后台堆栈变化的listener.

FragmentTransaction是对Fragment进行添加,替换,移除等操作的。
在使用add(),replace(),remove()时可以动态的给每一个Fragment添加一个标签,下次方便FragmentManager通过tag标签进行查找。最后记得ft.commit();
当执行一个移除fragment的事务时, 如果没有调用 addToBackStack(), 那么当事务提交后, 那个fragment会被销毁,并且用户不能导航回到它. 有鉴于此, 当移除一个fragment时,如果调用了 addToBackStack(), 那么fragment会被停止, 如果用户导航回来,它将会被恢复.////我认为是重要的, 

以上的话,可以理解,remove后,加到堆栈后。按返回还是可以返回到之前的fragment。

fragment的显示和隐藏可以用FragmentTransaction的show 或是hide来实现,

 ft.show(fragment);
 ft.hide(fragment);

时间: 2024-10-08 17:50:58

Fragment,FragmentManager, FragmentTransaction详解的相关文章

Fragment生命周期详解

Fragment生命周期详解 1. Fragment概述 Fragment从Android v3.0版本开始引入 随着界面布局的复杂化,处理起来也更加的复杂,引入Fragment可以把activity拆分成各个部分.每个Fragment都有它自己的布局和生命周期.方便了开发. 采用fragment而不是activity进行应用的UI管理,可绕开Android系统activity规则的限制. fragment是一种控制器对象,activity可委派它完成一些任务通常这些任务就是管理用户界面.受管的

FragmentTransaction 详解

什么是FragmentTransaction: Fragment 事务的对象 hinde 和 show 来隐藏和显示 Fragment. 描述一:FragmentTransaction对fragment进行添加,移除,替换,以及执行其他动作. 描述二: 使用Fragment时,可以通过用户交互来执行一些动作,比如增加.移除.替换等. 所有这些改变构成一个集合,这个集合被叫做一个transaction. 可以调用FragmentTransaction中的方法来处理这个transaction,并且可

Android fragment onHiddenChanged方法详解

项目中,为了实现不同fragment之间值得传递,首先想到的是利用bundle或者shareprefercnce之类的共享数据机制,当不符合项目需求,有点过于复杂和冗余,就利用网上一位前辈的建议,在主Activity中,创建一个共享的数据变量,在其他fragment中只要获取到这个值就可以得到数据,实现共享,代码如下: 主activity定义一个共享数据变量: private String instrName; public String getInstrName() { return inst

Android LaunchAnyWhere (Google Bug 7699048)漏洞详解及防御措施

开始 近日,Google修复一个组件安全的漏洞LaunchAnyWhere(Google Bug 7699048).这个漏洞属于Intend Based提取漏洞,攻击者利用这个漏洞,可以突破了应用间的权限隔离,达到调用任意私有Activity(exported为false)的目的. 该漏洞影响Android 2.3至4.3固件. 漏洞分析 在分析这个漏洞之前,需要先介绍两个东西. Account管理机制 从Android2.0开始,系统引入了Account管理机制,详细使用说明见Android官

Android编程之Fragment动画加载方法源码详解

上次谈到了Fragment动画加载的异常问题,今天再聊聊它的动画加载loadAnimation的实现源代码: Animation loadAnimation(Fragment fragment, int transit, boolean enter, int transitionStyle) { 接下来具体看一下里面的源码部分,我将一部分一部分的讲解,首先是: Animation animObj = fragment.onCreateAnimation(transit, enter, fragm

Android 开发 之 Fragment 详解

作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 1. Fragement 概述 Fragement 与 Activity 生命周期关系 : Fragement 嵌入到 Activity 组件中才可以使用, 其生命周期与 Activity 生命周期相关. -- stop 与 destroy 状态 : Activity 暂停 或者 销毁的时候, 其内部嵌入的所有的 Fragement 也会执行

5. Fragment详解

onCreateView是Fragment生命周期方法中最重要的一个.因为在该 方法中会创建在Fragment中显示的View. public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState){      // 装载布局文件 View view = inflater.inflate(R.layout.my_fragment, null); TextView textv

详解fragment(一):从源代码看fragment的生命周期

前面讲了那么多xml,我们缓一下,现在讲从代码角度来看fragment的创建. 我们通常会在FragmentActivity中通过如下方法: getSupportFragmentManager().beginTransaction().replace(R.id.content, fragment, tag).commit(); getSupportFragmentManager().beginTransaction().add(R.id.content, fragment, tag).commi

Android入门——Fragment详解之基本概念与用法(一)

引言 Android在3.0中引入了Fragments的概念,其目的是用在大屏幕设备上–例如平板电脑上,支持更加动态和灵活的UI设计.平板电脑的屏幕要比手机的大得多,有更多的空间来放更多的UI组件,并且这些组件之间会产生更多的交互.Fragment允许这样的一种设计,而不需要你亲自来管理 Viewhierarchy的复杂变化. 通过将Activity的布局分散到Fragment中, 你可以在运行时修改Activity的外观,并在由Activity管理的back stack中保存那些变化. 一.F