• Android_Fragment_Fragment具体解释


     

    Android_Fragment_Fragment具体解释

    分类: Android基础 92人阅读 评论(0) 收藏 举报

    文件夹(?)[+]

    1.Fragment概述

    在一个Activity中, Fragment代表UI的一个部分或者一个行为。一个Activity能够结合多个Fragment对象,也能够在多个activity中使用同样Fragment字节码相应的不同对象。一个Fragment对象必须被嵌入在一个主Activity对象中,该Fragment的生命周期与主Activity息息相关。比方,当主Activity处于paused状态,其相应的全部Fragment对象均处于paused状态,仅仅有当主Activity处于resumed状态时,Fragment才干处于自由控制状态。

    2.创建Fragment

    为了创建一个Fragment,应该去继承Fragment或者其子类,覆写对应的方法。比方onCreate(),OnCreateView(),onPause()等等

    (1).加入UI界面

    为该Fragment展现一个布局,必须去实现onCreateView()回掉方法。
    注意:当该Fragment继承了ListFragment时,不须要覆写onCreateView()方法,由于默认返回一个ListView对象

    [java] view plaincopy
    1. public View onCreateView(LayoutInflater inflater, ViewGroup container,  
    2.         Bundle savedInstanceState) {  
    3.     View view = inflater.inflate(R.layout.list, null);  
    4.     return view;  
    5. }  

    (2).加入Fragment到Activity

    1).通过layout布局文件

    android:name属性应该为Fragment相应类的完整路径。

    [html] view plaincopy
    1. <?xml version="1.0" encoding="utf-8"?>  
    2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
    3.     android:layout_width="match_parent"  
    4.     android:layout_height="match_parent"  
    5.     android:orientation="horizontal" >  
    6.   
    7.     <fragment  
    8.         android:id="@+id/list"  
    9.         android:name="com.example.news.ArticleListFragment"  
    10.         android:layout_width="0dp"  
    11.         android:layout_height="match_parent"  
    12.         android:layout_weight="1" />  
    13.     <fragment  
    14.         android:id="@+id/viewer"  
    15.         android:name="com.example.news.ArticleReaderFragment"  
    16.         android:layout_width="0dp"  
    17.         android:layout_height="match_parent"  
    18.         android:layout_weight="2" />  
    19.   
    20. </LinearLayout>  

    2).通过Java代码

    当Activity执行时,能够自由的在该activity上加入fragment对象,但应该指定一个ViewGroup容器,能够FragmentTransaction完毕fragment的加入移除或者替换。

    [java] view plaincopy
    1. manager = getFragmentManager();  
    2. if(manager.findFragmentByTag("right") == null){  
    3.     manager.beginTransaction().replace(R.id.right, new RightFrag(), "right").commit();  
    4. }  

    (3).fragment唯一标示符

    每一个fragment须要定义一个唯一的标识符,假设activity被销毁又又一次启动,系统可以恢复该fragment的状态。假设想又一次恢复,需满足以下有3种方式之中的一个:

    1).定义ID

    在布局文件里,定义android:id属性

    [html] view plaincopy
    1. <fragment  
    2.     android:id="@+id/list"  
    3.     android:name="com.example.news.ArticleListFragment"  
    4.     android:layout_width="0dp"  
    5.     android:layout_height="match_parent"  
    6.     android:layout_weight="1" />  

    2).指明tag

    android:tag 指明 或者 一个fragment对象add()或者replace()时指定tag

    [html] view plaincopy
    1. <fragment  
    2.     android:id="@+id/list"  
    3.     android:tag="first"  
    4.     android:name="com.example.news.ArticleListFragment"  
    5.     android:layout_width="0dp"  
    6.     android:layout_height="match_parent"  
    7.     android:layout_weight="1" />  

    或者

    [java] view plaincopy
    1. manager.beginTransaction()  
    2.     .replace(R.id.right, new RightFrag(), "right")//在事务中指明该fragment的tag  
    3. .commit();  

    3).viewgroup ID

    假设该fragment均没有id和tag,系统将使用container view布局的id

    3.Fragment的管理

    通过getFragmentManager()方法,能够得到FragmentManager对象,主要完毕以下的功能

    [java] view plaincopy
    1. FragmentManager manager = getFragmentManager();  

    (1).得到已经存在Fragment对象

    假设该fragment在布局文件里指定了id,通过findFragmentById()得到对象,或者指定了tag能够通过findFragmentByTag()得到对象

    [java] view plaincopy
    1. Fragment fragment = getFragmentManager().findFragmentByTag("right");  
    2. //or  
    3. Fragment fragment = getFragmentManager().findFragmentById(id);  

    (2).注冊OnBackStackChangedListener监听器

    能够用来监听该任务相应的返回栈信息,当该返回栈状态发生改变时,运行相应的onBackStackChanged() 方法

    [java] view plaincopy
    1. manager.addOnBackStackChangedListener(new FragmentManager.OnBackStackChangedListener() {  
    2.     @Override  
    3.     public void onBackStackChanged() {  
    4.         Toast.makeText(MainActivity.this"返回堆状态发生改变"1).show();  
    5.     }  
    6. });  

    (3).弹出返回栈

    模拟用户点击返回键,将指定的fragment从返回栈中弹出,该操作为异步的。前提是该fragment对象使用.beginTransaction().addToBackStack("right")加入了进返回栈

    [java] view plaincopy
    1. manager.popBackStack(); //Pop the top state off the back stack  

    (4).FragmentTransaction事务

    事务主要包括一些操作的集合,比方添加移除替换,动画设置等等

    [html] view plaincopy
    1. /*  
    2.  * 通过manager开启一个事务,该事务包括一些操作的集合,通事务能够 add(), remove(), replace()  
    3.  * 完毕对Fragment的操作,并使用commit()提交  
    4.  */  
    5. FragmentTransaction transaction = manager.beginTransaction();  
    6.   
    7. transaction.replace(R.id.right, new RightFrag(), "right");  
    8. transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);//设置动画  
    9. transaction.addToBackStack("right"); // 将该fragment增加返回堆  
    10. // 提交事务  
    11. transaction.commit();  

    (5).Fragment状态管理

    [java] view plaincopy
    1. /* 
    2.  * 管理Fragment的状态 
    3.  *  假设在一个主activityViewGroup中加入一个fragment, 
    4.  *  假设手机屏幕旋转了,当前activity被销毁重建,fragment也被activityManager创建 
    5.  *  故在onCreate中,须要推断一下 
    6.  */  
    7. @Override  
    8. protected void onCreate(Bundle savedInstanceState) {  
    9.     super.onCreate(savedInstanceState);  
    10.     setContentView(R.layout.activity_main);  
    11.     manager = getFragmentManager();  
    12.     if (manager.findFragmentByTag("right") == null) {  
    13.         // if(savedInstanceState == null)也可推断该fragment是否已经载入  
    14.   
    15.         manager.beginTransaction()  
    16.             .replace(R.id.right, new RightFrag(), "right")  
    17.             .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)// 设置动画  
    18.             .addToBackStack("right"// 将该fragment增加返回堆  
    19.         // 提交事务  
    20.         .commit();  
    21.     }  
    22. }  

    4.Fragment间信息交互

    (1).取得对象

    [java] view plaincopy
    1. /* 
    2.  * 点击该Fragment的button按钮,将该button的text设置为还有一个fragment中Edittext的文本值 
    3.  */  
    4. public View onCreateView(LayoutInflater inflater, ViewGroup container,  
    5.         Bundle savedInstanceState) {  
    6.     View view = inflater.inflate(R.layout.list, null);  
    7.     final Button button = (Button) view.findViewById(R.id.confirm);  
    8.     button.setOnClickListener(new View.OnClickListener() {  
    9.           
    10.         @Override  
    11.         public void onClick(View v) {  
    12.             //通过FragmentManager找到还有一个fragment中的edittext对象,并取得text内容  
    13.             EditText editText = (EditText)(getFragmentManager().findFragmentByTag("left").getView().findViewById(R.id.name));  
    14.             button.setText(editText.getText().toString());  
    15.         }  
    16.     });  
    17.     return view;  
    18. }  

     (2).通回掉函数

    [java] view plaincopy
    1. public class MainActivity extends Activity {  
    2.     private FragmentManager manager;  
    3.     private Button button;  
    4.   
    5.     @Override  
    6.     protected void onCreate(Bundle savedInstanceState) {  
    7.         super.onCreate(savedInstanceState);  
    8.         setContentView(R.layout.activity_main);  
    9.           
    10.         button.setOnClickListener(new View.OnClickListener() {  
    11.             @Override  
    12.             public void onClick(View v) {  
    13.                 RightFragment rightFrag = (RightFragment) (getFragmentManager().findFragmentByTag("right"));  
    14.                 /* 
    15.                  * 通过set方法,向其传递一个实例化对象,因为rightFrag.set()方法内部运行RightFragment.CallBack.get()方法,完毕了參数的传递 
    16.                  */  
    17.                 rightFrag.set(new RightFragment.CallBack() {  
    18.                     @Override  
    19.                     public void get(String str) {  
    20.                         button.setText(str);  
    21.                     }  
    22.                 });  
    23.             }  
    24.         });  
    25.     }  
    26.   
    27. }  
    [java] view plaincopy
    1. public class RightFragment extends ListFragment {  
    2.     private LoaderManager manager;  
    3.   
    4.     @Override  
    5.     public void onCreate(Bundle savedInstanceState) {  
    6.         super.onCreate(savedInstanceState);  
    7.         manager = getLoaderManager();  
    8.     }  
    9.   
    10.     /* 
    11.      * 点击该Fragment的button按钮,将该button的text设置为还有一个fragment中Edittext的文本值 
    12.      */  
    13.     public View onCreateView(LayoutInflater inflater, ViewGroup container,  
    14.             Bundle savedInstanceState) {  
    15.         View view = inflater.inflate(R.layout.list, null);  
    16.         return view;  
    17.     }  
    18.   
    19.     /** 
    20.      * 通过调用该方法,接收一个回掉函数对象,callBack.get(str); 
    21.      * @param callBack 
    22.      */  
    23.     public void set(CallBack callBack) {  
    24.         EditText editText = (EditText) getView().findViewById(R.id.name);  
    25.         callBack.get(editText.getText().toString());  
    26.     }  
    27.   
    28.     /* 
    29.      * 回掉接口 
    30.      */  
    31.     interface CallBack {  
    32.         public void get(String str);  
    33.     }  
    34. }  

    5.Fragment的生命周期

    (1).生命周期路线图

    生命状态

    周期过程

     

    foreground lifetime

    onResume(A)

    onResume(F)

    onPause(F)

    onPause(A)

    visible lifetime

    onCreateView(F)

    onActivityCreated(F)

    onStart(A)

    onStart(F)

    onResume(A)

    onResume(F)

    onPause(F)

    onPause(A)

    onStop(F)

    onStop(A)

    onDestroyView(F)

    entire lifetime

    完整的生命周期

     (2).生命周期回掉函数概述

    方法 描写叙述
    onAttach(Activity)

    当前Fragment与Activity关联,调用!

    onCreate()

    完毕fragment的初始化创建

      onCreateView()

    创建并返回与当前fragment相关联的层次视图view

      onActivityCreated()

    主activity的onCreate()运行完后,该方法才运行

      onStart()

    fragment可见,当主activity处于started状态后运行

        onResume()

    fragment能与用户交互,当主activity处于resumed状态后运行

        onPause()

    fragment不在与用户交互,可能在主activity将要处于paused前运行,可能该fragment被改动

      onStop()

    fragment不在可见,可能在主activity将要处于stopped前运行,可能该fragment被改动

      onDestroyView()

    同意该fragment清理视图相关资源

    onDestroy()

    清理掉视图state信息

    onDetach()

    该fragment不在于activity关联

     

  • 相关阅读:
    设计模式学习——前言和目录
    模板颜色搭配
    win7、xp下Meclipse SVN用户名修改
    JS编码解码
    用Javascript进行HTML转义(分享)
    打印异常信息
    lucene 抛出的异常(分享)
    SQL语句优化(分享)
    Java集群之session共享解决方案
    VUE中返回上一页
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4060331.html
Copyright © 2020-2023  润新知