• 从vue的角度看android Fragment


     

    使用层面的区别

    Fragment业务场景来说,一定程度等于vue的component,而路由对应的vue文件类同安卓的activity。

    vue即使页面也可以做组件被另外个页面组件使用。但是Acitivity不能,android 里面fragment和Acitivity是严格区分的,是用不同的类实现的,生命周期也不大一样。

    生命周期

    图片来源:5.1 Fragment基本概述 | 菜鸟教程

    安卓里面的Fragment的使用更加显得古板,需要像jquery添加dom一样追加,显示和隐藏

    Fragment用AndroidStudio创建

    Fragment的创建方式与Activity几乎一样,只是创建时候选择的是Fragment. AndroidStudio创建Fragment时候会创建布局文件和java类

    Java类会在onCreateView方法里面自动绑定布局文件&&返回view类实例

    代码如下:

    1. @Override
    2. public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    3.     View view = inflater.inflate(R.layout.fragment_my,container,false);
    4.     TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
    5.     txt_content.setText(content);
    6.     return view;
    7. }

    也可以给Fragment的构造函数添加参数,以便在Acitvity实例该类的时候传递数据

    例如:

    1. private String content;
    2. public MyFragment(String content) {
    3.     this.content = content;
    4. }


    整个代码如下:

    1. package com.example.fragmenttab;
    2. import android.os.Bundle;
    3. import androidx.fragment.app.Fragment;
    4. import android.view.LayoutInflater;
    5. import android.view.View;
    6. import android.view.ViewGroup;
    7. import android.widget.TextView;
    8. /**
    9. * A simple {@link Fragment} subclass.
    10. * Use the {@link MyFragment#newInstance} factory method to
    11. * create an instance of this fragment.
    12. */
    13. public class MyFragment extends Fragment {
    14.     private String content;
    15.     public MyFragment(String content) {
    16.         this.content = content;
    17.     }
    18.     @Override
    19.     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    20.         View view = inflater.inflate(R.layout.fragment_my,container,false);
    21.         TextView txt_content = (TextView) view.findViewById(R.id.txt_content);
    22.         txt_content.setText(content);
    23.         return view;
    24.     }
    25. }

    Activy消费该Fragment的时候,用vue的说法就是挂载该组件,Activy内部维护给变量来存储管理fragment的对象

    private FragmentManager fManager;

    在onCreate的生命周期给fManager赋值

    1. @Override
    2. protected void onCreate(Bundle savedInstanceState) {
    3.     super.onCreate(savedInstanceState);
    4.     //赋值
    5.     fManager = getSupportFragmentManager();
    6. }



    赋值后,我们就可以在其他方法添加,显示,隐藏,某些Fragment了。

    事务

    对当前Activity的Fragment进行添加,显示,隐藏,移除的操作,可以无限次的读取事务,得到的都是对当前Activity的Fragment的事务对象。FragmentTransaction只能使用一次,每次使用都要调用FragmentManager 的beginTransaction()方法获得FragmentTransaction事务对象哦!

    FragmentTransaction fTransaction = fManager.beginTransaction();

    不过,这里先记录下如何实例一个Fragment,如果Fragment类名为MyFragment,就需要先实例,然后通过getSupportFragmentManager()的add方法添加到1⃣️Activity的xml布局文件上,add的第一个参数是xml某个Fragment的id,第二个参数是Fragment实例代码如下:

    1. MyFragment fg1 = new MyFragment("第一个Fragment");
    2. fTransaction.add(R.id.ly_content,fg1);

    上面代码可以看到,实例的时候我们给MyFragment类传递了个字符串参数

    1⃣️对于的xml代码如下

    1. <FrameLayout
    2.     android:layout_width="match_parent"
    3.     android:layout_height="match_parent"
    4.     android:id="@+id/ly_content">
    5. </FrameLayout>

    显示已隐藏的Fragment

    fTransaction.show(fg1);

    隐藏

    if(fg1 != null)fragmentTransaction.hide(fg1);

    注意需要判空,否则可能会报错

    弃用

    FragmentManager是 androidx.fragment.app(已弃用的不考虑)下的抽象类,创建用于 添加,移除,替换 fragment 的事务(transaction)

    该用getSupportFragmentManager替代

    其余相关api

    • getSupportFragmentManager与 activity关联,可以将其视为 activity 的 FragmentManager
    • getChildFragmentManager 与 fragment关联,可以将其视为fragment的FragmentManager
    • getParentFragmentManager情况稍微复杂,正常情况返回的是该fragment 依附的activity的FragmentManager。如果该fragment是另一个fragment 的子 fragment,则返回的是其父fragment的 getChildFragmentManager

  • 相关阅读:
    react 路由的组件说明、路由的执行过程
    合肥工业大学自然语言处理实验报告
    读书笔记:彼得·德鲁克《认识管理》第11章 若干例外及经验教训
    Flare Network,跨越互操作性三难困境
    MySQL的InnoDB存储引擎中的自适应哈希索引技术
    HIT_OS_LAB2 调试分析 Linux 0.00 多任务切换
    分布式 - 服务器Nginx:基础系列之Nginx静态资源配置优化sendfile | tcp_nopush | tcp_nodelay
    超声波传感器(CHx01) 学习笔记 Ⅳ- 程序移植
    华为云 存在不支持迁移的外键解决方法
    Intellij idea 的maven项目如何通过maven自动下载jar包
  • 原文地址:https://blog.csdn.net/u014071104/article/details/127115092