Fragment总结

作者: YoungTa0 | 来源:发表于2018-04-25 16:53 被阅读76次

    目录

    1.Fragment简述
    2.Fragment使用
    3.Fragment与Activity交互
    4.Fragment与Activity的生命周期

    Fragment简述

    Fragment是在Android 3.0 (API level 11)开始引入的,它能让你的app在现有基础上性能大幅度提高,并且占用内存降低,同样的界面Activity占用内存比Fragment要多,响应速度Fragment比Activty在中低端手机上快了很多,甚至能达到好几倍,"单Activity + 多Fragment架构"和"多模块Activity + 多Fragment架构"应运而生

    Fragment使用

    1.编写Fragment布局

    创建fragment01.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="fragment01"/>
    
    </LinearLayout>
    
    2.创建Fragment的子类

    通常, 应当至少实现如下的生命周期方法:
    onCreate()
    当创建fragment时, 系统调用该方法.
    在实现代码中,应当初始化想要在fragment中保持的必要组件, 当fragment被暂停或者停止后可以恢复.
    onCreateView()
    fragment第一次绘制它的用户界面的时候, 系统会调用此方法. 为了绘制fragment的UI,此方法必须返回一个View, 这个view是你的fragment布局的根view. 如果fragment不提供UI, 可以返回null.
    onPause()
    用户将要离开fragment时,系统调用这个方法作为第一个指示(然而它不总是意味着fragment将被销毁.) 在当前用户会话结束之前,通常应当在这里提交任何应该持久化的变化(因为用户有可能不会返回).

    创建Fragment01,因为例子中fragment01布局简单,所以只实现了onCreateView()

    public class Fragment01 extends Fragment {
        @Override
        public View onCreateView( LayoutInflater inflater,  ViewGroup container, Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment01,container,false);
            return view;
        }
    }
    
    3.将Fragment添加到Activity中

    将Fragment添加到Activity中有两种方式,一种是在在activity的layout文件中声明fragment;另一种是动态添加,下面讲动态添加方法。

    动态添加Fragment时,需要在Activity的layout文件中声明一个ViewGroup。当activity运行的任何时候, 都可以将fragment添加到ViewGroup。

    Activity布局文件如下:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/bt_fragment01"
            android:text="fragment01"/>
        <Button
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/bt_fragment02"
            android:text="fragment02"/>
    </LinearLayout>
        <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
            android:id="@+id/fragment_container"
            android:layout_width="match_parent"
            android:layout_height="match_parent"/>
    
    </LinearLayout>
    

    Activity逻辑如下:

    public class MainActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            initView();
        }
    
        @Override
        public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
            
        }
    
        private void initView(){
            Button bt_fragment01 = findViewById(R.id.bt_fragment01);
            Button bt_fragment02 = findViewById(R.id.bt_fragment02);
            bt_fragment01.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Fragment01 fragment01 = new Fragment01();
                    addFragment(fragment01);
                }
            });
            bt_fragment02.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                Fragment02 fragment02 = new Fragment02();
                addFragment(fragment02);
                }
            });
        }
        private void addFragment(Fragment fragment){
            //1.获取到FragmentManager,在V4包中通过getSupportFragmentManager
            //在系统中原生的Fragment是通过getFragmentManager获得的。
            android.support.v4.app.FragmentManager FM = getSupportFragmentManager();
            //2.开启一个事务,通过调用beginTransaction方法开启。
            FragmentTransaction fragmentTransaction =FM.beginTransaction();
            //3.向容器内加入Fragment,一般使用add或者replace方法实现,需要传入容器的id和Fragment的实例。使用replace可以防止fragment重叠
            fragmentTransaction.replace(R.id.fragment_container,fragment);
            //4.提交事务,调用commit方法提交。
            fragmentTransaction.commit();
        }
    }
    

    Fragment动态添加到Activity步骤:
    1.获取到FragmentManager
    2.开启一个事务
    3.向容器内加入Fragment
    4.提交事务
    注意事项:
    在使用fragmentTransaction.add()向容器添加fragment时,如果布局文件已经添加了fragment,再次添加,会出现重叠现象,而使用replace不会。

    Fragment与Activity交互

    尽管Fragment被实现为一个独立于Activity的对象,并且可以在多个activity中使用,但一个给定的fragment实例是直接绑定到包含它的activity的. 特别的,fragment可以使用 getActivity() 访问Activity实例, 并且容易地执行比如在activity layout中查找一个view的任务.

    View listView =getActivity().findViewById(R.id.list); 
    

    同样地,activity可以通过从FragmentManager获得一个到Fragment的引用来调用fragment中的方法, 使用findFragmentById() 或 findFragmentByTag().

    ExampleFragment fragment (ExampleFragment) getFragmentManager().findFragmentById(R.id.example_fragment)
    

    Fragment与Activity数据交互参考:
    https://blog.csdn.net/chenliguan/article/details/53906934
    https://www.jianshu.com/p/1b824e26105b

    Fragment与Activity的生命周期

    fragment所生存的activity的生命周期,直接影响fragment的生命周期,每一个activity的生命周期的回调行为都会引起每一个fragment中类似的回调.
    例如,当activity接收到onPause()时,activity中的每一个fragment都会接收到onPause().
    Fragment 有一些额外的生命周期回调方法, 那些是处理与activity的唯一的交互,为了执行例如创建和销毁fragment的UI的动作. 这些额外的回调方法是:
    onAttach()
    当fragment被绑定到activity时被调用(Activity会被传入.).
    onCreateView()
    创建和fragment关联的view hierarchy时调用.
    onActivityCreated()
    当activity的onCreate()方法返回时被调用.
    onDestroyView()
    当和fragment关联的view hierarchy正在被移除时调用.
    onDetach()
    当fragment从activity解除关联时被调用.

    Fragment生命周期

    相关文章

      网友评论

        本文标题:Fragment总结

        本文链接:https://www.haomeiwen.com/subject/jnaelftx.html