Android-Fragment(碎片)

本文详细介绍了Android中的Fragment,包括Fragment的概念、与Activity的关系、生命周期及其调用场景。Fragment可作为activity界面的模块化组件,能在多个activity中复用。文章还解析了Fragment的生命周期,从onAttach()到onDetach()的各个阶段,并展示了如何通过XML布局声明Fragment以及动态添加Fragment的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Fragment(碎片)

概念:Fragment在应用的扮演的是模块化、可重用的角色。Fragment定义了自己的布局,以及通过它自己的生命周期回调方法定义了它自己的行为,你可以将Fragment包含在多个activity中。

Activity和Fragment的关系:
Activity----Fragment
房子 ---- 房间

Fragment知识概要
1.Fragment可以作为activity界面的一部分组成出现
2.一个activity中可以放置多个Fragment,而且一个Fragment也可以在多个activity中复用
3.可以在activity运行时动态的添加、删除、替换Fragment
4.Fragment有自己的生命周期,它的生命周期和所在activity的生命周期有一定的关联

详细解读每个方法的调用场景
onAttach方法

Fragment和Activity建立关联的时候调用(获得activity的传递的值)

onCreateView方法

为Fragment创建视图(加载布局)时调用(给当前的fragment绘制UI布局,可以使用线程更新UI)

onActivityCreated方法

当Activity中的onCreate方法执行完后调用(表示activity执行oncreate方法完成了的时候会调用此方法)

onDestroyView方法
Fragment中的布局被移除时调用(表示fragment销毁相关联的UI布局)

onDetach方法

Fragment和Activity解除关联的时候调用(脱离activity)

fragment生命周期解析
当一个fragment被创建的时候:
onAttach()
onCreate()
onCreateView()
onActivityCreated()

当这个fragment对用户可见的时候,它会经历以下状态。
onStart()
onResume()

当这个fragment进入“后台模式”的时候,它会经历以下状态。
onPause()
onStop()

当这个fragment被销毁了(或者持有它的activity被销毁了):
onPause()
onStop()
onDestroyView()
onDestroy()
onDetach()

就像Activity一样,在以下的状态中,可以使用Bundle对象保存一个fragment的对象。
onCreate()
onCreateView()
onActivityCreated()

其他场景的调用
屏幕灭掉

onPause() onSaveInstanceState() onStop()

屏幕解锁

onStart() onResume()

切换到其他Fragment
onPause() onStop() onDestroyView()

切换回本身的Fragment

onCreateView() onActivityCreated() onStart() onResume()

回到桌面

onPause() onSaveInstanceState() onStop()

回到应用

onStart() onResume()

退出应用

onPause() onStop() onDestroyView() onDestroy() onDetach()

Fragment的使用

由于Fragment作为Activity的一部分,所以Fragment的使用一般是添加到Activity中,一般有两种方法将Fragment添加到Activity中:

方法1:在activity的layout.xml文件中声明fragment

方法2:在activity的layout.xml文件中声明包含

方法1
layout文件fragment_layout_test.xml

<fragment android:name=“com.skywang.app.FragmentLayoutTest$ExampleFragment”

android:id="@+id/list"

android:layout_weight=“1”
android:layout_width=“match_parent”
android:layout_height=“match_parent”/>

说明

  1. 该layout只包含了一个fragment元素。
  2. fragment的属性

android:name=“com.skywang.app.FragmentLayoutTest$ExampleFragment”

说明该fragment是定义在包名为”com.skywang.app”中类”FragmentLayoutTest”“的内部类”ExampleFragment”中的。

FragmentLayoutTest.java

package com.skywang.app;

import android.os.Bundle;

import android.app.Activity;

import android.view.View;

import android.view.ViewGroup;

import android.view.LayoutInflater;

import android.widget.TextView;

import android.app.Fragment;

public class FragmentLayoutTest extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
    
    // fragment_layout_test只包括ExampleFragment对象。
     setContentView(R.layout.fragment_layout_test);
    }



// 继承与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);
    
    }

}

}

说明:

  1. FragmentLayoutTest通过

setContentView(R.layout.fragment_layout_test)

来调用fragment_layout_test.xml来作为布局文件。

  1. 上面的fragment_layout_test.xml布局文件仅仅值包括1个Fragment,该Fragment是通过FragmentLayoutTest的内部类ExampleFragment实现的

  2. 内部类ExampleFragment继承于Fragment,在onCreateView()方法中通过

return inflater.inflate(R.layout.example_fragment, container, false)

来将example_fragment.xml作为其布局文件。
所以,相当于FragmentLayoutTest直接调用example_fragment.xml来显示。

方法2
该Fragment采用动态加载的方式。

FragmentTransactionTest

package com.skywang.app;

import android.os.Bundle;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.app.Activity;

import android.app.Fragment;

import android.app.FragmentManager;

import android.app.FragmentTransaction;

public class FragmentTransactionTest extends Activity {

@Override

protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
            setContentView(R.layout.fragment_transaction_test);

    

    // 获取FragmentManager
    
    FragmentManager fragmentManager = getFragmentManager();
    
    // 获取FragmentTransaction        
            FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();

    

    // 获取ExampleFragment
    
    ExampleFragment fragment = new ExampleFragment();
      // 将fragment添加到容器about_fragment_container中
      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);
    
    }

}

}

说明:

  1. 在onCreate()中该activit调用fragment_transaction_test作为其布局文件

  2. 在onCreate()中,通过获取FragmentManager和FragmentTransaction,来将ExampleFragment对象添加到R.id.about_fragment_container中,about_fragment_container是一个Fragment。

  3. ExampleFragment的onCreateView()中,将example_fragment作为其布局文件。

fragment_transaction_test.xml

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

example_fragment.xml

 <TextView
    
 android:text="Hello Fragment"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"/>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值