• 从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

  • 相关阅读:
    在浏览器地址栏键入URL按下回车之后会经历什么?
    在Ubuntu 18.04上支持C++17的std::filesystem的方法
    Android学习笔记 3. EditText
    x86汇编代码学习-计算机工作原理1
    Resin反序列化链分析
    python:基础知识
    c++ Strategy模式
    系分 - 项目管理
    EasyXnote5关于批量绘图
    intel驱动程序和支持助理常见问题:不识别、无法检测等问题解决方法
  • 原文地址:https://blog.csdn.net/u014071104/article/details/127115092