Fragment
public final boolean isAdded()
如果该Fragment对象被添加到了它的Activity中,那么它返回true,否则返回false。
public final boolean isDetached()
如果该Fragment已经明确的从UI中分离,那么它返回true。也就是说,在该Fragment对象上使用FragmentTransaction.detach(Fragment)方法。
该方法在API Level 13中被引入。
public final boolean isHidden()
如果该Fragment对象已经被隐藏,那么它返回true。默认情况下,Fragment是被显示的。能够用onHiddenChanged(boolean)回调方法获取该Fragment对象状态的改变,要注意的是隐藏状态与其他状态是正交的---也就是说,要把该Fragment对象显示给用户,Fragment对象必须是被启动并不被隐藏。
Public final boolean isInLayout()
如果布局通过<fragment>标签被包含在Activity层次树中,那么它就返回true。当Fragment是通过<fragment>标签来创建的时候,这个方法始终会返回true。从之前的状态恢复旧的Fragment对象,并且该对象没有显示在当前状态的布局中的情况除外。
Public final boolean isRemoving()
如果当前的Fragment对象正在从它的Activity中被删除,那么就返回true。这删除过程不是该Fragment对象的Activity的结束过程,而是把Fragment对象从它所在的Activity中删除的过程。
public final boolean isResumed()
如果Fragment对象是在恢复状态中,该方法会返回true。在onResume()和onPause()回调期间,这个方法都返回true。
Public final boolean isVisible()
如果该Fragment对象对用户可见,那么就返回true。这就意味着它:1.已经被添加到Activity中;2.它的View对象已经被绑定到窗口中;3.没有被隐藏。
Public void onActivityCreated(Bundle savedInstanceState)
当Fragment对象的Activity被创建,并且Fragment对象的View层次树被实例化的时候,系统会调用这个方法。能够利用这个方法来做一些最后的初始化处理,如获取或恢复状态,还可用于那些使用setRetainInstance(boolean)方法来保留它们的实例的Fragment对象,因为这个回调方法会告诉Fragment对象,它是在什么时候跟这个新的Activity实例关联的。该回调方法在onCreateView(LayoutInflater, ViewGroup, Bundle)之后和onStart()之前被调用。
参数
savedInstanceState 如果该Fragment对象正在被重建,那么该参数指定之前被保存的状态。
public void onActivityResult(int requestCode, int resultCode, Intent data)
接收来自前面调用startActivityForResult(Intent, int)方法的结果。在Activity API的相关介绍中有关于onActivityResult(int, int, Intent)方法的介绍。
参数
requestCode 这个整数是由startActivityForResult()提供的初始请求Code,允许用来标识该结果的来源。
resultCode 这个整数是由子Activity通过它的setResult()方法设置并返回的结果Code。
Data 一个Intent类型的对象,它把结果数据返回给调用者(能包各种数据绑定给Intent对象的extras属性字段)。
public void onAttach(Activity activity)
当该Fragment对象被第一次绑定到它的Activity时,系统会调用这个方法。这个方法被调用之后,系统会调用该Fragment对象的onCcreate(Bundle)方法。
public void onConfigurationChanged(Configuration newConfig)
当设备配置改变且组件正在运行时,系统会调用这个方法。要注意的是,跟Activity不一样,在配置改变时,其他的组件不会被重启:它们始终通过重新获取资源来处理这种改变。
在该功能被调用后,被更新的资源对象会返回与新的配置相匹配的资源值。
参数
newConfing 指定新的设备配置。
public boolean onContextItemSelected(MenuItem item)
在上下文菜单中的一个菜单项被选择时,系统会调用这个回调方法。对于所放生的普通的处理过程,该方法的默认实现只是简单的返回false(调用该项目的Runnable对象或把一个消息发送给相应的Handler)。可以使用这个方法针对菜单项做一些其他的处理。
使用getMenuInfo()方法来获取由添加给菜单项的View对象所设置的附加信息。
其子类应用通过调用基类的该方法实现来执行默认的菜单处理。
参数
item 该参数指定了被选择的上下文菜单项。
返回值
如果允许正常的上下文菜单处理,就返回false,否则返回true。
public void onCreate(Bundle savedInstanceState)
Fragment对象被初始创建时,系统会调用该方法。调用时机是在onAttach(Activity)之后,onCreateView(LayoutInflater, ViewGroup, Bundle)之前。
要注意的是,该方法在其Fragment的Activity依然在被创建的过程中,也能够被调用。因此,不能在这个时点依赖正在被初始化的Activity的上下文View层次树。
参数
savedInstanceState 如果该Fragment正在被重建,那么这个参数会指定Fragment之前的状态。
public Animator onCreateAnimator(int transit, boolean enter, int nextAnim)
在Fragment对象加载一个动画时,系统会调用这个方法。
问题1:java.lang.IllegalStateException: Fragment already added异常的处理。
当快速双击调用FragmentTransaction.add()方法添加fragmentA,而fragmentA不是每次单独生成的,就会引起这个异常。
DialogFragment.show()内部调用了FragmentTransaction.add()方法,所以调用DialogFragment.show()方法时候也可能会出现这个异常。
在add()方法时候,先判断fragmentA.isAdded(),如下调用可以避免该异常:
if(!fragmentA.isAdded()){
FragmentManager manager = ((FragmentActivity)context).getSupportFragmentManager();
FragmentTransaction ft = manager.beginTransaction();
ft.add(fragmentA, "fragment_name");
ft.commit();
}
问题2:java.lang.IllegalStateException: Fragment MyFragment{410f6060} not attached to Activity
出现该异常,是因为Fragment的还没有Attach到Activity时,调用了如getResource()等,需要上下文Content的函数。
解决方法,就是等将调用的代码写在OnStart()中。另外一种解决方法主要是在调用:
getResources().getString(R.string.app_name); 之前增加一个判断isAdded(),
参考:
http://stackoverflow.com/questions/10919240/fragment-myfragment-not-attached-to-activity
问题3:java.lang.IllegalStateException: Fragment already active
在 Fragment 没有被添加到 FragmentManager 之前,我们可以通过 Fragment.setArguments() 来设置参数,并在 Fragment 中,使用 getArguments() 来取得参数。在 Fragment 被添加到 FragmentManager 后,一旦被使用,我们再次调用 setArguments() 将会导致 java.lang.IllegalStateException: Fragment already active 异常。
解决方法:可以使用setter和getter方法进行数据的存储和获取。
参考:http://stackoverflow.com/questions/10364478/got-exception-fragment-already-active/15084683
问题4:java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
在使用Fragment保存参数的时候,可能是因为需要保存的参数比较大或者比较多,这种情况下页会引起异常。比如代码:
Bundle b = new Bundle();
b.putParcelable("bitmap", bitmap2);
imageRecognitionFragment.setArguments(b);
设置好参数,并且添加hide(),add(),方法之后,需要commit(),来实现两个Fragment跳转的时候,这种情形下参数需要进行系统保存,但是这个时候你已经实现了跳转,系统参数却没有保存。此时就会报
java.lang.IllegalStateException: Can not perform this action after onSaveInstanceState
异常。
分析原因:你并不需要系统保存的参数,只要你自己设置的参数能够传递过去,在另外一个Fragment里能够顺利接受就行了,现在android里提供了另外一种形式的提交方式commitAllowingStateLoss(),从名字上就能看出,这种提交是允许状态值丢失的。到此问题得到完美解决,值的传递是你自己控制的。
这里也说一下另外一个问题,bitmap 也可以通过Bundle传递的,使用putParacelable就可以了。