• Fragment初探


    Fragment允许将Activity拆分成多个完全独立封装的可重用的组件,每个组件有它自己的生命周期和UI布局。Fragment最大的优点是为不同屏幕大小创建灵活的UI。每个Fragment都是独立的模块,多个Activity可以共用一个Fragment,可以在Activity中进行Fragment的添加,删除,更换。

    创建Fragment

    继承Fragment类创建新的Fragment。

    public class TestFragment extends Fragment {
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle  savedInstanceState) {
            //创建或者填充Fragment的UI,并且返回
            //如果这个Fragment没有UI,返回null
            return inflater.inflate(R.layout.fragment_page, container, false);
        }
    }
    

    Fragment不需要在Manifest中进行注册。它的生命周期依赖于它所嵌入的Activity。

    Fragment生命周期

    Fragment和Activity的生命周期类似,但是有自己特有的生命周期处理程序。Fragment还包含一些Callback,用来标识它父Activity之间的绑定和解绑定关系、它自己View的创建和销毁情况以及它父Activity的创建过程完成情况。

    public class TestFragment extends Fragment {
    
        //调用该方法Fragment会被连接到它的父Activity上
        @Deprecated
        @Override
        public void onAttach(Activity activity) {
            super.onAttach(activity);
        }
    
        //调用该方法Fragment会被连接到它的父Activity上
        @Override
        public void onAttach(Context context) {
            super.onAttach(context);
            //获取对context的引用
        }
    
        //调用该方法进行Fragment的初始创建
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
        }
    
        //创建自己的用户界面
        @Nullable
        @Override
        public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle  savedInstanceState) {
            return inflater.inflate(R.layout.fragment_page, container, false);
        }
    
        //父Activity和Fragment已经创建
        @Override
        public void onActivityCreated(@Nullable Bundle savedInstanceState) {
            super.onActivityCreated(savedInstanceState);
            //完成Fragment的初始化,尤其那些父Activity被初始化完成后或者Fragment的View被完全填充后才能做的事情
        }
    
        //在可见生命周期开始时调用
        @Override
        public void onStart() {
            super.onStart();
        }
    
        //在活动周期开始时调用
        @Override
        public void onResume() {
            super.onResume();
        }
    
        //在活动生命周期结束时调用
        @Override
        public void onPause() {
            super.onPause();
        }
    
        //保存UI状态
        @Override
        public void onSaveInstanceState(Bundle outState) {
            super.onSaveInstanceState(outState);
            //outState会传递给onCreate、onCreateView和onActivityCreate方法中
        }
    
        //在可见生命周期结束时调用
        @Override
        public void onStop() {
            super.onStop();
        }
    
    
        //当Fragment的View被分离时,调用
        @Override
        public void onDestroyView() {
            //清除资源相关的View
            super.onDestroyView();
        }
    
        //在整个生命周期结束时调用该方法
        @Override
        public void onDestroy() {
            //清除所有资源,结束线程和关闭数据库连接等
            super.onDestroy();
        }
    
    
        //当Fragment从它的父Activity上分离时,调用该方法
        @Override
        public void onDetach() {
            super.onDetach();
        }
    }
    

    Activity管理Fragment

    每一个Activity都包含一个FragmentManager来管理它所包含的Fragment。可以通过使用getFragmentManager或者getSupportFragmentManager()来访问FragmentManager:

    FragmentManager fragmentManager = getSupportFragmentManager();
    

    FragmentManager提供很多方法来访问Fragment,通过执行FragmentTransaction来添加、删除和替换Fragment。

    静态添加

    在Activity布局文件中使用fragment标签来包含要添加的fragment:

    <fragment
         android:name="com.fengwei23.PageFragment"
         android:layout_width="match_parent"
         android:layout_height="match_parent"/>
    

    动态添加

    在Activity的布局文件中使用FrameLayout来当作Fargment的容器:

    <FrameLayout
        android:id="@+id/fl_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    

    然后在Activity中使用FragmentTransaction来创建相应的Fragment,并添加到对应的容器中:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    PageFragment pageFragment = new PageFragment();
    fragmentTransaction.add(R.id.fl_container,pageFragment);
    //指定动画
    //可以添加到回退栈中
    fragmentTransaction.commit();
    

    添加、替换和删除Fragment

    添加:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    PageFragment pageFragment = new PageFragment();
    fragmentTransaction.add(R.id.fl_container,pageFragment);
    fragmentTransaction.commit();
    

    替换:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    PageFragment pageFragment = new PageFragment();
    fragmentTransaction.replace(R.id.page_fragment,pageFragment);
    fragmentTransaction.commit();
    

    删除:

    FragmentManager fragmentManager = getSupportFragmentManager();
    FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
    PageFragment pageFragment = fragmentManager.findFragmentById(R.id.page_fragment);
    fragmentTransaction.remove(pageFragment);
    fragmentTransaction.commit();
    

    查找Fragment

    通过XML布局方式把Fragment加到Activity中,使用fragmentManager.findFragmentById(R.id.page_fragment)查找。如果添加的Fragment有加入TAG,可使用fragmentManager.findFragmentByTag(FRAGMENT_TAG)

    Fragment Back栈

    Fragment的回退栈类似于Activity的栈,当想要管理Fragment的时候可以使用fragmentTransaction.addToBackStack(tag),这样在可见的Fragment返回时会回到上一个可见的Fragment。

    FragmentTransaction加载动画

    使用fragmentTransaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN)可以添加过渡动画、使用fragmentTransaction.setCustomAnimations()可以添加自定义动画。

    Fragment和Activity交互

    Fragment获得Activity的引用:getActivity(),Fragment传递事件给Activity可以使用接口回调等。

  • 相关阅读:
    css清除浮动
    vue在v-for循环中绑定v-model
    Element UI 数字输入框组件添加鼠标滚动事件
    vue-cli搭建vue开发环境
    vue组件通信
    H5新增的postMessage跨域解决方案Demo
    零碎方法笔记
    django中操作cookie与session
    python中装饰器修复技术
    django中orm的批量操作
  • 原文地址:https://www.cnblogs.com/fengwei23/p/9274440.html
Copyright © 2020-2023  润新知