• (转)一份关于Fragment的详细使用教程


    Fragment的产生
    在Fragment(android 3.0)诞生前,安卓开发中通常使用Activity来展示界面,但它有一定的局限性:

    1、界面中的View控件较多较复杂时,操作麻烦

    2、手机和平板中展示的效果不一致


    为了在Android上为用户提供动态的、多窗口的交互体验,我们需要将UI组件和Activity操作封装成模块进行使用,使得我们可以在activity中对这些模块进行切入切出操作,而这些模块就是Fragment。

    Fragment的应用场景

     如上是官方给出的一张图片,可以看出,平板电脑因为尺寸较大,展示item详情的FragmentB直接显示在了列表右边区域, 而手机屏幕比较小,故需要跳转才能看到FragmentB(手机上虽然是两个Activity,但是用的是同一个FragmentB),类似的具体的例子:手机和平板中的设置界面。

    Fragment的使用:

    • 静态使用Fragment:在activity的XML布局文件中定义fragment
    • 动态使用Fragment:在activity运行时用代码动态添加fragment
    • v4包下Fragment的使用:为了兼容3.0以前的版本,推荐使用v4包下的Fragment

    创建和使用Fragment的步骤:

    • 创建子类继承Fragment
    • 重写onCreateView()方法定义fragment的布局
    • 将fragment引入到Activity中
    public class NewsFragment extends Fragment {
     
        /**
         * onCreateView是fragment第一次创建绘制用户界面时系统回调的方法
         * @param inflater 布局填充器,用于将xml文件转换成view对象
         * @param container 当前fragment插入activity的布局视图对象
         * @param savedInstanceState 存储上一个fragment的信息
         * @return 返回值View表示当前加载的fragment视图,若不提供视图可以返回Null
         */
        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            //将指定资源的xml文件转换成具体的view对象
            View view = inflater.inflate(R.layout.fragment_news,null);
            return view;
        }
    }

    在Activity的布局文件中引用:

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        xmlns:tools="http://schemas.android.com/tools"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">
     
        <fragment
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:name="com.example.limanma.cr7rm.fragment.NewsFragment"/>
     
    </LinearLayout>

    如上就是静态使用fragment的过程,非常简单,接下来看看动态使用:

    public class MainActivity extends AppCompatActivity {
     
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
     
            //1.创建Fragment的管理器对象
            FragmentManager manager = getSupportFragmentManager();
     
            //2.开启事务
            FragmentTransaction transaction = manager.beginTransaction();
            
            //3.调用事务的动态操作,这里是添加
            transaction.add(R.id.fl_container,new NewsFragment());
            
            //4.提交事务
            transaction.commit();
        }
    }

    Fragment的生命周期:(Fragment is added之后,Fragment执行如下方法)


    Fragment和Activity生命周期的对比:


    Fragment与Activity间的通信

    • Activity向Fragment传值
    • Fragment向Activity传值
    • Fragment与Fragment间传递数据

    Activity向Fragment传值:Activity调用setArguments()传递数据,Fragment调用getArguments()接收数据

    Fragment向Activity传值:接口回调,具体步骤如下:

    1.在Fragment中定义传值的回调接口,在生命周期的onAttach()或onCreate()方法中获取接口的实现

    public interface TestInterface{
        void fromFragmentToActivity(String msg);
    }
    
    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        mTestInterface = (TestInterface) getActivity();
    }

    2.在Fragment需要传值的位置调用回调接口方法传值

        @Nullable
        @Override
        public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
            View view = inflater.inflate(R.layout.fragment_news, null);
         
            ...
     
            mTestInterface.fromFragmentToActivity("哈哈哈");
     
            return view;
        }

    3.在Activity中实现回调接口并重写回调方法,获取传递过来的值

    public class MainActivity extends AppCompatActivity implements NewsFragment.TestInterface {
     
        ...
     
        @Override
        public void fromFragmentToActivity(String msg) {
            Log.i("TAG","从绑定的Fragment传递过来的数据:" + msg);
        }
    }

    Fragment与Fragment间传递数据:

     

    ListFragment和DialogFragment的应用
    ListFragment继承于Fragment,ListFragment的内容是以列表(list)的形式显示的,它的简单使用可参照如下链接:

    https://www.kancloud.cn/digest/androidtome/117268

    DialogFragment在android 3.0时被引入,官方推荐使用DialogFragment来管理对话框,它的详细使用可参照如下链接:

    https://blog.csdn.net/lmj623565791/article/details/37815413
    ————————————————
    版权声明:本文为CSDN博主「里曼马都」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/qq_35770354/article/details/83477313

  • 相关阅读:
    ora-01847:月份中日的值必须介于 1 和当月最后一日之间
    (转)ORACLE中关于外键缺少索引的探讨和总结
    (转) Oracle性能优化-读懂执行计划
    shutdown immediate 持久无法关闭数据库之解决方案
    Oracle11g adump目录下面.aud增长导致空间撑满无法删除导致CRS无法启动的解决方法
    linux几种常见的文件内容查找和替换命令
    unzip解压3G或者4G以上文件失败的解决方法
    IMP-00058: ORACLE error 1882 encountered
    AIX文件系统/var空间100%的问题
    html5手机网站需要加的那些meta/link标签,html5 meta全解(转)
  • 原文地址:https://www.cnblogs.com/wangle1001986/p/12843920.html
Copyright © 2020-2023  润新知