转载

初识Fragment

关于Fragment的重要性,不言而喻。不但应用在平板中,还广泛的用在手机应用程序中。由于没有在线上的应用中使用过Fragment,所以本文也是带着初探的心使用Fragment,下面通过demo初步使用Fragment.

首先还是阅读官方API文档,养成查阅文档的习惯对于学习非常有帮助,笔者英文水平也不是很好,但是理解文档的内容还是可以的;当然对于理解底层的知识,还需要阅读源码。对于Android开发人员来说,JDK,SDK 的API文档是必备的。 

初识Fragment

截图真的是浪费版面,哈哈,上面没有什么需要解释的。Fragment(碎片)的生命周期依附于它的"宿主",也就是Activity,只有当Activity存在的时候,才可以有Fragment,Activity结束的时候,Fragment也就消失了。碎片有自己的布局,然后放置在Activity布局中,既然碎片的宿主是Activity,那么两者肯定有信息交流。碎片与Activity一样,有着生命周期,理解起来也很简单,首先看创建碎片需要经历哪些过程:

初识Fragment

省略了Activity的生命周期过程,所以以上不是完整的碎片生命周期过程,那么碎片销毁的过程是如何呢:

初识Fragment

上面的回调函数很好理解,那么下面是官方提供的碎片完整生命周期图:

初识Fragment

解释几个回调函数:

onAttach() 当碎片与活动建立关联的时候调用

onCreateView() 为碎片加载布局文件的时候调用

onActivityCreated()  与碎片相关联的活动已经创建时候调用

onDestroyView() 被碎片加载的视图被移除时候调用

onDetach() 当碎片和关联的活动解除关联时调用

下面通过demo实现两个Fragment拼凑成一个Activity,并且动态实现第三个Fragment替换其中一个Fragment,下面看第一个Fragment:的布局:fragment_title.xml

[html]view plain copy
 print?初识Fragment初识Fragment
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  2.     android:layout_width="match_parent"    
  3.     android:layout_height="45dp"   
  4.      >    
  5.     
  6.   <Button  
  7.       android:id="@+id/buttonone"   
  8.       android:layout_width="match_parent"  
  9.       android:layout_height="match_parent"  
  10.       android:background="@color/red"  
  11.       android:text="我是Button One!"/>  
  12. </LinearLayout>    
创建第一个Fragment:
[java]view plain copy
 print?初识Fragment初识Fragment
  1. public class TitleFragment extends Fragment    
  2. {     
  3.    @Override    
  4.    public View onCreateView(LayoutInflater inflater, ViewGroup container,    
  5.            Bundle savedInstanceState)    
  6.    {    
  7.        View view = inflater.inflate(R.layout.fragment_title, container, false);    
  8.        Button button = (Button)view.findViewById(R.id.buttonone);  
  9.        button.setOnClickListener(new OnClickListener() {  
  10.           
  11.         @Override  
  12.         public void onClick(View v) {  
  13.             // TODO 自动生成的方法存根  
  14.             Toast.makeText(getActivity(),"你好,我是Button-one",Toast.LENGTH_LONG).show();  
  15.         }  
  16.     });  
  17.        return view;    
  18.    }    
  19. }    
第二个Fragment的布局:frament_content.xml
[html]view plain copy
 print?初识Fragment初识Fragment
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  2.     android:layout_width="match_parent"   
  3.     android:gravity="center"   
  4.     android:layout_height="match_parent"    
  5.     android:orientation="vertical" >    
  6.     <Button   
  7.         android:id="@+id/buttontwo"  
  8.         android:layout_width="match_parent"  
  9.         android:layout_height="match_parent"  
  10.         android:text="我是Button Two!"  
  11.         android:translationZ="10dp"  
  12.         android:background="@drawable/ripple"  
  13.         />  
  14. </LinearLayout>    
创建第二个Fragment: ContentFragment.java
[java]view plain copy
 print?初识Fragment初识Fragment
  1. public class ContentFragment extends Fragment    
  2. {    
  3.     @Override    
  4.     public View onCreateView(LayoutInflater inflater, ViewGroup container,    
  5.             Bundle savedInstanceState)    
  6.     {    
  7.         View view = inflater.inflate(R.layout.frament_content, container, false);    
  8.         Button button = (Button)view.findViewById(R.id.buttontwo);  
  9.         button.setOnClickListener(new OnClickListener() {  
  10.               
  11.             public void onClick(View v) {  
  12.                 // TODO 自动生成的方法存根  
  13.                 Toast.makeText(getActivity(),"你好,我是Button Two!",Toast.LENGTH_SHORT).show();;  
  14.             }  
  15.         });  
  16.         return view;  
  17.     }    
  18.    
  19. }    
第三个Fragment布局:replace.xml
[html]view plain copy
 print?初识Fragment初识Fragment
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     android:layout_width="match_parent"  
  3.     android:layout_height="match_parent"  
  4.     android:orientation="vertical" >  
  5.     <Button  
  6.         android:id="@+id/buttonthree"  
  7.         android:layout_width="match_parent"  
  8.         android:layout_height="match_parent"  
  9.         android:background="@color/yellow"  
  10.         />  
  11. </LinearLayout>  
创建第三个Fragment:
[java]view plain copy
 print?初识Fragment初识Fragment
  1. public class replaceFragment extends Fragment{  
  2.    public View onCreateView(LayoutInflater layoutInflater,ViewGroup viewGroup,Bundle savedInstanceState){  
  3.     View view = layoutInflater.inflate(R.layout.replace,viewGroup,false);  
  4.     Button buttonthree=(Button)view.findViewById(R.id.buttonthree);  
  5.     buttonthree.setText(getResources().getString(R.string.buttonthree));//获取字符串资源 与在Activity中无异  
  6.     buttonthree.setOnClickListener(new OnClickListener() {  
  7.           
  8.         public void onClick(View v) {  
  9.             // TODO 自动生成的方法存根  
  10.             Toast.makeText(getActivity(),"你好,我是Buttonthree",Toast.LENGTH_LONG).show();  
  11.         }  
  12.     });  
  13.     return view;   
  14.    }  
  15. }  
那么接下来就是主布局文件了:
[html]view plain copy
 print?初识Fragment初识Fragment
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2.     xmlns:tools="http://schemas.android.com/tools"  
  3.     android:orientation="vertical"    
  4.     android:layout_width="match_parent"    
  5.     android:layout_height="match_parent" >    
  6.        
  7.     <FrameLayout   
  8.         android:id="@+id/framelayout"  
  9.         android:layout_width="match_parent"  
  10.         android:layout_height="0dp"  
  11.         android:layout_weight="1">  
  12.          <fragment           <!--用<frament/>标签添加一个碎片,android:name属性指定要添加的碎片,必须加上完整的包名-->  
  13.         android:id="@+id/id_fragment_title"    
  14.         android:name="com.example.fragment.TitleFragment"     
  15.         android:layout_width="match_parent"    
  16.         android:layout_height="match_parent"/>              
  17.     </FrameLayout>  
  18.           
  19.         <fragment    
  20.         android:id="@+id/id_fragment_content"    
  21.         android:name="com.example.fragment.ContentFragment"    
  22.         android:layout_width="fill_parent"    
  23.         android:layout_height="0dp"  
  24.         android:layout_weight="1" />    
  25. </LinearLayout>    
代码部分:
[java]view plain copy
 print?初识Fragment初识Fragment
  1. public class MainActivity extends Activity    
  2. {    
  3.     private Button button ;  
  4.     private Fragment replaceFragment;  
  5.       
  6.     @Override    
  7.     protected void onCreate(Bundle savedInstanceState)    
  8.     {    
  9.         super.onCreate(savedInstanceState);    
  10.         requestWindowFeature(Window.FEATURE_NO_TITLE);    
  11.         setContentView(R.layout.activity_main);  
  12.                 // TODO 自动生成的方法  
  13.         button = (Button)findViewById(R.id.buttonone);  
  14.         button.setOnClickListener(new OnClickListener() {  
  15.               
  16.             public void onClick(View v) {  
  17.                 // TODO 自动生成的方法存根  
  18.                   FragmentManager fragmentManager = getFragmentManager();  
  19.                  //TitleFragment titleFragment = (TitleFragment)getFragmentManager().findFragmentById(R.id.fragment_title);获得TitleFragment的实例  
  20.                   FragmentTransaction transaction = fragmentManager.beginTransaction();  
  21.                   transaction.replace(R.id.framelayout,new replaceFragment());  
  22.                   transaction.addToBackStack(null);  
  23.                   transaction.commit();  
  24.                  
  25.                  
  26.             }  
  27.         });  
  28.         
  29.                    
  30.        }  
  31.     }  

上面主要是通过FragmentManager开启一个事务,然后通过事务来替换FrameLayout中的Fragment,然后在事务结束前,调用addToBackStatck(),把替换掉的事务添加到返回栈中,所以在替换后,按back键,会回到替换前的Fragment中去,然后再按back键,退出activity.

文档中给出的说明:

[html]view plain copy
 print?初识Fragment初识Fragment
  1. After each call to this function, a new entry is on the stack, and pressing back will pop it to return the user to   
  2. whatever previous state the activity UI was in.   
其中参数一般为null
运行结果:
初识Fragment


关于Fragment与Activity间通信交流代码中已经给出,在Fragment中通过getActivity()可以获得与之关联的活动;

在Activity中,通过

TitleFragment titleFragment =(TitleFragment)getFragmentManager().findFragmentById(R.id.fragment_title),获得活动中Fragment的实例。


正文到此结束
Loading...