Android平台微型技术博客1

相信大家对Fragment的都不陌生,对于Fragment的使用,一方面Activity需要在布局中为Fragment安排位置,另一方面需要管理好Fragment的生命周期。Activity中有个FragmentManager,其内部维护fragment队列,以及fragment事务的回退栈。

一般情况下,我们在Activity里面会这么添加Fragment:

[java] view plain copy

  1. public class MainActivity extends FragmentActivity  
  2. {  
  3.       
  4.     private ContentFragment mContentFragment  ;   
  5.   
  6.     @Override  
  7.     protected void onCreate(Bundle savedInstanceState)  
  8.     {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.activity_main);  
  11.       
  12.         FragmentManager fm = getSupportFragmentManager();  
  13.         mContentFragment = (ContentFragment) fm.findFragmentById(R.id.id_fragment_container);  
  14.           
  15.         if(mContentFragment == null )  
  16.         {  
  17.             mContentFragment = new ContentFragment();  
  18.             fm.beginTransaction().add(R.id.id_fragment_container,mContentFragment).commit();  
  19.         }  
  20.   
  21.     }  
  22.   
  23. }  


针对上面代码,问两个问题:

1、为什么需要判null呢?

主要是因为,当Activity因为配置发生改变(屏幕旋转)或者内存不足被系统杀死,造成重新创建时,我们的fragment会被保存下来,但是会创建新的FragmentManager,新的FragmentManager会首先会去获取保存下来的fragment队列,重建fragment队列,从而恢复之前的状态。

2、add(R.id.id_fragment_container,mContentFragment)中的布局的id有何作用?

一方面呢,是告知FragmentManager,此fragment的位置;另一方面是此fragment的唯一标识;就像我们上面通过fm.findFragmentById(R.id.id_fragment_container)查找~~

好了,简单回顾了一下基本用法,具体的还请参考上面的博客或者其他资料,接下来,介绍一些使用的意见~~

Fragment Arguments

下面描述一个简单的场景,比如我们某个按钮触发Activity跳转,需要通过Intent传递参数到目标Activity的Fragment中,那么此Fragment如何获取当前的Intent的值呢?

有哥们会说,这个简单?看我的代码(问题代码):

[java] view plain copy

  1. public class ContentFragment extends Fragment  
  2. {  
  3.       
  4.     private String mArgument ;   
  5.     public static final String ARGUMENT ="argument";  
  6.     @Override  
  7.     public void onCreate(Bundle savedInstanceState)  
  8.     {  
  9.         super.onCreate(savedInstanceState);  
  10.           
  11.         mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);  
  12.           
  13.     }  


我们直接在Fragment的onCreate中,拿到宿主Activty,宿主Activity中肯定能通过getIntent拿到Intent,然后通过get方法,随意拿参数~~

这么写,功能上是实现了,但是呢?存在一个大问题:我们用Fragment的一个很大的原因,就是为了复用。你这么写,相当于这个Fragment已经完全和当前这个宿主Activity绑定了,复用直接废了~~~所以呢?我们换种方式,推荐使用arguments来创建Fragment。

[java] view plain copy

  1. public class ContentFragment extends Fragment  
  2. {  
  3.   
  4.     private String mArgument;  
  5.     public static final String ARGUMENT = "argument";  
  6.   
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState)  
  9.     {  
  10.         super.onCreate(savedInstanceState);  
  11.         // mArgument = getActivity().getIntent().getStringExtra(ARGUMENT);  
  12.         Bundle bundle = getArguments();  
  13.         if (bundle != null)  
  14.             mArgument = bundle.getString(ARGUMENT);  
  15.   
  16.     }  
  17.   
  18.     /** 
  19.      * 传入需要的参数,设置给arguments 
  20.      * @param argument 
  21.      * @return 
  22.      */  
  23.     public static ContentFragment newInstance(String argument)  
  24.     {  
  25.         Bundle bundle = new Bundle();  
  26.         bundle.putString(ARGUMENT, argument);  
  27.         ContentFragment contentFragment = new ContentFragment();  
  28.         contentFragment.setArguments(bundle);  
  29.         return contentFragment;  
  30.     }  


给Fragment添加newInstance方法,将需要的参数传入,设置到bundle中,然后setArguments(bundle),最后在onCreate中进行获取;

这样就完成了Fragment和Activity间的解耦。当然了这里需要注意:

setArguments方法必须在fragment创建以后,添加给Activity前完成。千万不要,首先调用了add,然后设置arguments。

猜你喜欢

转载自blog.csdn.net/IamFiora/article/details/80746338