您的位置:首页 > 移动开发 > Android开发

Android编程心得---Fragment使用总结(一)

2014-04-21 15:28 351 查看
注册Fragment两种方法:

第一种:在xml中直接画出Fragment

<fragment
android:id="@+id/xml_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


或者通过加载Fragment类:

<fragment	android:name="com.example.jingdong.XmlFragment"
android:id="@+id/xml_fragment"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />


第二种:在代码中实现

创建一个类继承Fragment

在要使用这个Fragment的View中通过FragmentManager进行添加add()或切换replace()

Fragment fragment = new ExampleFragment();
getSupportFragmentManager().beginTransaction().add(R.id.fl_down_single, fragment).commit();
或者

Fragment fragment = new ExampleFragment();
getSupportFragmentManager().beginTransaction().add(fragment, "my_fragment_tag").commit();


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

FragmentMannager中的方法

1. 继承关系

java.lang.Object

    |____android.app.FragmentManager

2. 类概要

这个类提供了与Activity内部的Fragment对象进行交互的接口。

虽然FragmentManager的API是在HONEYCOMB的版本中被引入的,但是在旧的平台上还有一个通过FragmentActivity类来使用的API版本。

HONEYCOMB:http://developer.android.com/reference/android/os/Build.VERSION_CODES.html#HONEYCOMB

3. 类说明

嵌套(内部)类

interface FragmentManager.BackStackEntry

代表了Fragment回退堆栈的一个项目实体,调用FragmentTransaction.addToBackStack()方法时会创建这个项目实体。

interface FragmentManager.OnBackStackChangedListener

观察回退堆栈变化的接口

常量
public static final int POP_BACK_STACK_INCLUSIVE

针对popBackStack(String, int)和popBackStack(int, int)方法所设置的标记。如果在调用这两个方法时,设置了这个标记,并且已经提供了回退堆栈中项目实体的名称或ID,那么堆栈中所有匹配的项目实体都会被消耗,直到没有匹配的,或到达堆栈的底部为止。

常量值:1(0x00000001)

Public 构造器

FragmentManager()

Public 方法

public abstract void addOnBackStackChanageListener(FragmentManager.OnBackStackChangedListener)

添加一个新的监听器,用于监听Fragment回退堆栈的变化。

public abstract FragmentTransaction beginTransaction()

启动一个跟FragmentManager关联的一系列的与Fragment对象相关的编辑操作。

注意:一个Fragment事务只能在Activity保存其状态期间被创建/被提交。如果在Activity.onSaveInstanceState()方法调用之后,提交事务则会发生错误。这是因为系统框架需要保存当前Fragment对象的状态,并且如果在状态保存之后来改变Fragment,那么改变的结果也会丢失。

public abstract void dump(String prefix, FileDescriptor fd, PrintWriter writer, String[] args)

把FragmentManager的状态打印输出到给定的流中。

参数:

prefix--->在每行文本的前面要打印输出的文本。

fd--->要输出的转存文件的描述。

writer--->给转存操作设置的一个PrintWriter对象。

args--->给转存请求提供一组额外的参数。

public static void enableDebugLogging(boolean enabled)

控制是否打开框架内Fragment管理器的调试日志(log)。如果开启调试日志,那么就会在Logcat中看到框架执行Fragment操作的日志信息。

public abstract boolean executePendingTransactions()

在用FragmentTransaction.commit()方法提交FragmentTransaction对象后,会在进程的主线程中,用异步的方式来执行。如果想要立即执行这个等待中的操作,就要调用这个方法(只能在主线程中调用)。要注意的是,所有的回调和相关的行为都会在这个调用中被执行完成,因此要仔细确认这个方法的调用位置。

返回值:如果等待中的事务被执行,那么就会返回true。

public abstract Fragment findFragmentById(int id)

这个方法用于查找由给定的id所标识的那个Fragment对象。这个id既可以是源自布局填充时的XML,也可以是添加事务时的容器ID。这个方法首先会搜索被添加到当前管理的Activity中的Fragment对象,如果没有找到,它会搜索当前回退堆栈中所有的Fragment对象,以便找到跟这个ID匹配的Fragment对象。

返回值:如果找到,则返回一个Fragment对象,否则返回null。

public abstract Fragment findFragmentByTag(String tag)

这个方法用于查找由给定的标签所标识的一个Fragment对象,这个标签既可以源自布局填充时XML,也可以是在添加事务时所提供的。这个方法首先会搜索被添加到当前管理的Activity中的Fragment对象,如果没有找到,它会搜索当前回退堆栈中所有的Fragment对象,以便找到跟这个标签匹配的Fragment对象。

返回值:如果找到,则返回一个Fragment对象,否则返回null。

public abstract FragmentManager.BackStackEntry getBackStackEntryAt(int index)

这个方法返回回退堆栈中由index索引所标识的BackStackEntry对象,索引0指向堆栈底部的实体对象。

public abstract int getBackStackEntryCount()

返回回退堆栈中当前实体对象的数量。

public abstract Fragment getFragment(Bundle bundle, String key)

返回最近一次用putFragment(Bundle, String, Fragment)方法放置的Fragment对象实例。

参数:

bundle--->制指定要从哪个Bundle对象中获取Fragment引用。

key--->指定Bundle对象中实体对象的名称。

返回值:返回跟给定引用关联的当前Fragment对象实例。

public void invalidateOptionsMenu()

必要的时候,让依附于Activity的选项菜单失效。直到Activity转移到恢复(resumed)状态,这种失效状态才会被终止。

public abstract void popBackStack()

把顶部的状态弹出回退堆栈。这个方法是异步执行的。它会按照请求的顺序来执行弹出操作,但是这个操作直到应用程序把控制权返回给事件循环之后,才能够执行这个操作。

public abstract void popBackStack(String name, int flags)

从管理器的Fragment回退堆栈中把最后放入的由name参数所指定的Fragment对象弹出。这个函数是异步的,它会按照请求的顺序来执行弹出操作,但是直到应用程序把控制权返回给事件循环之后,才会执行这个操作。

参数:

name--->如果这个参数是非空的,那么就要在回退堆栈中查找这个名称所指向的Fragment对象。如果找到,那么这个状态之上的所有状态都会被弹出。POP_BACK_STACK_INCLUSIVE标记能够用于控制命名状态本身是否要被弹出。如果这个参数是null,则只有顶部状态会被弹出。

flags--->既可以是0,也可以是POP_BACK_STACK_INCLUSIVE。

public abstract void popBackStack(int id, int flags)

把给定ID标识所指定的状态之上的所有状态都弹出回退堆栈。这个方法是异步,它会按照请求的顺序来执行弹出操作。但是直到应用程序把控制权返回个事件循环之后才会执行这个操作。

参数:

id--->这个参数设定了要弹出的状态的标识。如果被标识的状态不存在,则什么也不做。POP_BACK_STACK_INCLUSIVE标记能够用于控制id所标识的状态本身是否会被弹出堆栈。

flags--->即可以是0,也可以是POP_BACK_STACK_INCLUSIVE。

public abstract boolean popBackStackImmediate(int id, int flags)

与popBackStack(int, int)方法类似,但是在这个调用的内部,会立即执行弹出操作。就像调用executePendingTransactions()方法之后的效果一样。

返回值:如果弹出了某些状态,则返回true,否则返回false。

public abstract boolean popBackStackImmediate(String name, int flags)

与popBackStack(String, int)方法类似,但是在这个调用的内部,会立即执行弹出操作。就像调用executePendingTransactions()方法之后的效果一样。

返回值:如果弹出了某些状态,则返回true,否则返回false。

public abstract boolean popBackStackImmediate()

与popBackStack()方法类似,但是在这个调用的内部,会立即执行弹出操作。就像调用executePendingTransactions()方法之后的效果一样。

返回值:如果弹出了某些状态,则返回true,否则返回false。

public abstract void putFragment(Bundle bundle, String key, Fragment fragment)

把一个指定的Fragment对象放入一个Bundle对象中。这个Bundle对象能够作为持久的状态来保存,并且在后续的调用getFragment(Bundle, String)方法来恢复的时候,它会返回一个与当前实例相同的Fragment对象。

参数:

bundle--->这个参数指定了一个Bundle对象,方法执行时,会把指定的Fragment对象引用放到这个Bundle对象中。

key--->这参数指定在Bundle对象中这个实体的名称。

fragment--->这个参数指定要保存的Fragment对象的引用。

public abstract void removeOnBackStackChangedListener(FragmentManager.OnBackStackChangedListener listener)

删除之前用addOnBackStackChangedListener(OnBackStackChangedListener)方法添加的一个监听器。

public abstract Fragment.SavedState saveFragmentInstanceState(Fragment f)

存给定的Fragment对象的当前状态。在创建一个新的Fragment对象实例,并且把它添加到Fragment管理器中之后,能够使用这个方法来创建一个跟Fragment对象的当前状态匹配的状态对象。使用这个方法时要注意以下限制:

1. Fragment对象必须跟当前的FragmentManager对象绑定;

2. 使用这个被保存的状态来创建一个新的Fragment对象,必须与创建这个状态的Fragment对象有相同的类类型。

3. 被保存的状态不能包含对其他的Fragment对象依赖,也就是说,不能使用putFragment(Bundle, String, Fragment)方法来保存一个Fragment对象的引用,因为这个引用这个引用在后续使用时可能是无效的。同样Fragment对象的目标和结果代码也不能包含在这个要保存的状态中。

参数:

f--->要保存状态的Fragment对象。

返回值:生成的状态对象,如果没有感兴趣的由Fragment所创建的状态,那么这个方法会返回null。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

使用Fragment时,可以通过用户交互来执行一些动作,比如增加、移除、替换等。

  所有这些改变构成一个集合,这个集合被叫做一个transaction。

  可以调用FragmentTransaction中的方法来处理这个transaction,并且可以将transaction存进由activity管理的back stack中,这样用户就可以进行fragment变化的回退操作。

  可以这样得到FragmentTransaction类的实例: 

FragmentManager fragmentManager = getFragmentManager();

FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();


 

  每个transaction是一组同时执行的变化的集合。

  用add(), remove(), replace()方法,把所有需要的变化加进去,然后调用commit()方法,将这些变化应用。

  在commit()方法之前,你可以调用addToBackStack(),把这个transaction加入back stack中去,这个back stack是由activity管理的,当用户按返回键时,就会回到上一个fragment的状态。

  比如下面的代码就是用一个新的fragment取代之前的fragment,并且将前次的状态存储在back stack中。

  

// Create new fragment and transaction
Fragment newFragment = new ExampleFragment();
FragmentTransaction transaction = getFragmentManager().beginTransaction();

// Replace whatever is in the fragment_container view with this fragment,
// and add the transaction to the back stack
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// Commit the transaction
transaction.commit();


 

  在这个例子中,newFragment将取代在R.id.fragment_container容器中的fragment,如果没有,将直接添加新的fragment。

  通过调用addToBackStack(),commit()的一系列转换作为一个transaction被存储在back stack中,用户按Back键可以返回上一个转换前的状态。

  当你移除一个fragment的时候,如果commit()之前没有调用addToBackStack(),那个fragment将会是destroyed;如果调用了addToBackStack(),这个fragment会是stopped,可以通过返回键来恢复。

android.support.v4.app.FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.show(fragment);//显示传入的fragment
ft.hide(fragment);//隐藏传入的fragment


关于commit()方法

  调用commit()方法并不能立即执行transaction中包含的改变动作,commit()方法把transaction加入activity的UI线程队列中。

  但是,如果觉得有必要的话,可以调用executePendingTransactions()方法来立即执行commit()提供的transaction。

  这样做通常是没有必要的,除非这个transaction被其他线程依赖。

  注意:你只能在activity存储它的状态(当用户要离开activity时)之前调用commit(),如果在存储状态之后调用commit(),将会抛出一个异常。

  这是因为当activity再次被恢复时commit之后的状态将丢失。如果丢失也没关系,那么使用commitAllowingStateLoss()方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息