【Android -- 四大组件】Fragment

211 阅读3分钟

一、概述

1.1 基本概念

2.1 Fragment VS Activity

  1. 一个Activity可以运行多个Fragment
  2. Fragment不能脱离activity而存在
  3. activity是屏幕的主体,而Fragment是activity的一个组成元素

2.3 声明周期

1 周期图
  • 周期图

  • 对比activity和Fragment

2. 各种操作
  1. 创建任务

  1. 点击HOME键 周期先是暂停,在停止,并没有销毁,还在后台保留

  1. 从主界面打开任务界面
    这个周期是先启动,让后就从新开始了

  2. 在试下在任务界面点返回键
    任务周期先为暂停状态,然后为销毁状态

  1. 接着试下旋转屏幕会发生什么
    可以看到执行了较多的生命周期方法,大致意思就是这个任务先是暂停了,然后就销毁,重新调用了回调函数,创建了新的视图,创建成功后,就重新开始了

  1. 在试下在任务界面直接多任务切换回来
    这个过程就相当于点返回键,在多任务切换回任务界面

二、静态加载 VS 动态加载

2.1 静态加载:xml

2.2 动态加载

  • 步骤1:在Activity的布局文件定义占位符
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    
    <FrameLayout
        android:id="@+id/about_fragment_container"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
    
</LinearLayout>

  • 步骤2:设置Fragment的布局文件 example_fragment.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
   xmlns:tools="http://schemas.android.com/tools"
   android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:orientation="vertical" >

   <TextView
       android:text="@string/example_fragment"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"/>
  
</LinearLayout>
  • 步骤3:在Activity的.java文件中动态添加Fragment
public class FragmentTransactionTest extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.fragment_transaction_test);
        
        // 步骤1:获取FragmentManager
        FragmentManager fragmentManager = getFragmentManager();

        // 步骤2:获取FragmentTransaction        
        FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
        
        // 步骤3:创建需要添加的Fragment :ExampleFragment
        ExampleFragment fragment = new ExampleFragment();

        // 步骤4:动态添加fragment
        // 即将创建的fragment添加到Activity布局文件中定义的占位符中(FrameLayout)
        fragmentTransaction.add(R.id.about_fragment_container, fragment);
        fragmentTransaction.commit();
    }
    
    // 继承与Fragment
    public static class ExampleFragment extends Fragment {
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            
            return inflater.inflate(R.layout.example_fragment, container, false);
            // 将example_fragment.xml作为该Fragment的布局文件
        }
    }
}
  • 敏捷方式
// activity--->fragment value

// 1. 创建需要添加的Fragment :ExampleFragment
ExampleFragment fragment = new ExampleFragment();

// 2:动态添加fragment
getSupportFragmentManager()
        .beginTransaction()
        .add(R.id.about_fragment_container, fragment)
        .commit();
listFragment.setOnTitleClickListener(this);

2.3 动态切换实例

FragmentManager

要管理Activity中的Fragments,就需要使用FragmentManager类。通过getFragmentManager()或getSupportFragmentManager()获得 。

  • findFragmentById(int id):根据ID来找到对应的Fragment实例,主要用在静态添加Fragment的布局中,因为静态添加的Fragment才会有ID
  • findFragmentByTag(String tag):根据TAG找到对应的Fragment实例,主要用于在动态添加的Fragment中,根据TAG来找到Fragment实例
  • getFragments()|获取所有被add进Activity中的Fragment 实例。
  • benginTransatcion(): 开启一个事物。
FragmentTransaction

如果需要添加、删除、替换Fragment,则需要借助于FragmentTransaction对象,FragmentTransaction 代表 Activity 对 Fragment 执行的多个改变。

  1. add(int containerViewId, Fragment fragment, String tag)将一个Fragment实例添加到Activity的最上层 。

  2. remove(Fragment fragment):将一个Fragment实例从Activity的Fragment队列中删除。

  3. replace(int containerViewId, Fragment fragment):替换containerViewId中的Fragment实例。注意,它首先把containerViewId中所有Fagment删除,然后再add进去当前的Fragment 实例。

  4. hide(Fragment fragment):隐藏当前的Fragment,仅仅是设为不可见,并不会销毁。

  5. show(Fragment fragment):显示之前隐藏的Fragment。

  6. detach(Fragment fragment):会将view从UI中移除,和remove()不同,此时Fragment的状态依然由FragmentManager维护。

  7. attach(Fragment fragment):重建view视图,附加到UI上并显示。

  8. commit(): 提交一个事务。

// 找到校长
FragmentManager fragmentManager = getSupportFragmentManager(); 
// 找到秘书
FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();  

// 创建一个fragment
TestFragment testFragment = TestFragment.newInstance(null, null); 
// 只需commit一次
fragmentTransaction.add(R.id.fragment_view, testFragment);  

// 最后要commit,向校长汇报
fragmentTransaction.remove(testFragment).commit();