Android第一行代码Day04笔记

本文详细介绍了Android中Fragment的使用,包括静态和动态添加、模拟返回栈以及与Activity的通信。同时,讲解了Fragment的生命周期及其回调方法,并探讨了如何根据设备屏幕尺寸动态加载布局。此外,还提供了在不同屏幕尺寸下加载不同布局的实现方法。

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

tips:创建Fragment的xml文件时,需要注意名称和路径的正确性,因为xml文件不会报错,而是等运行以后才会报错

4.Fragment

Fragment:碎片,可以嵌入活动中的UI片段,使用多个Fragment可以在单独的Activity中建立多个UI面板,也可以在多个Activity中重用Fragment

4.1Fragment的简单用法:

4.1.1 静态添加Fragment

流程:

  1. 在layout目录下创建布局文件
  2. 创建对应的Java类并继承于androidx包下的Fragment,重写onCreateView()方法,将创建好的布局文件加载并返回
  3. 在主活动的布局文件中引入,使用标签,需要指定 android:name,为全类名

代码示例:

//想要创建一个Fragment,必须创建一个Fragment的子类,或者继承一个已经存在的Fragment的子类。当系统首次调用Fragment,如果想绘制一个UI界面,那么在Fragment中必须重写OnCreateView()方法返回一个View

//Fragment子类
public class DemoFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
		//动态加载fragment的布局文件并返回
        View view = inflater.inflate(R.layout.布局文件名称,container,false);

        return view;
    }
}

在主活动的布局文件中引入:

    <fragment
        android:id="@+id/fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="Fragment子类的全类名"     
        >
    </fragment>

然后直接运行即可

4.1.2 动态添加碎片

流程:

  1. 创建待添加的碎片实例
  2. 通过getSupportFragmentManager()方法获取FragmentManager实例
  3. 通过fragmentManager.beginTransaction()方法开启一个事务
  4. 通过add()方法添加或者replace()方法替换Fragment,传入要替换的布局文件和Fragment实例
  5. 提交事务

代码示例:(基本固定写法)

首先创建Fragment的布局文件以及Fragment的子类,并重写onCreateView()方法,将创建好的布局文件加载并返回,并且不用在主活动布局文件添加

  • 添加Fragment
//实例化要添加的Fragment对象
 DemoFragment demoFragment = new DemoFragment();
     
 FragmentManager fragmentManager = getSupportFragmentManager(); // 获取 FragmentManager的实例
     
 FragmentTransaction transaction = fragmentManager.beginTransaction(); //开启一个事务
     
 transaction.add(R.id.布局文件名称,demoFragment); //为某一个Activity添加一个显示详细内容的Fragment
     
 transaction.commit();//提交事务
  • 替换Fragment
 FragmentManager fragmentManager = getSupportFragmentManager(); // 获取FragmentManager的实例
 
 FragmentTransaction transaction = fragmentManager.beginTransaction(); //开启一个事务
     
     //实例化要替换的Fragment对象
 DemoFragment demoFragment = new DemoFragment();
       
     //根据点击事件判断要替换的Fragment,f=new 替换的Fragment类(); 
 transaction.replace(R.id.要替换的fragment名称,demoFragment); // 替换Fragment
     
 transaction.commit();//提交事务

4.1.3 在碎片中模拟返回栈

再添加一个碎片之后,通过按下back返回键程序就会退出,如果想要模拟Activity的返回栈,可以使用addToBackStack()方法实现

示例:

	//在开启事务时调用
	transaction.addToBackStack(null);//接收一个名字用于描述返回栈的状态,一般传入null

4.1.4 碎片和活动之间进行通信

  • 在活动中获取碎片实例:
    通过 getSupportFragmentManager().findFragmentById(R.id.布局文件名称)方法可以获取活动中相应碎片的实例
//直接调用
getSupportFragmentManager().findFragmentById(R.id.布局文件名称);
  • 在碎片中获取活动实例:
    每个碎片中都可以调用getActivity()方法获取和当前碎片关联的活动实例
getActivity()
  • 在碎片中获取碎片实例:
    首先通过碎片获取当前碎片关联的活动实例,在通过活动获取另外一个碎片的实例
getActivity().getSupportFragmentManager().findFragmentById(R.id.布局文件名称);

4.2碎片的生命周期

4.2.1 碎片的状态和回调方法

碎片的状态:

  • 运行状态:当一个碎片可见,且它所关联的活动正处于运行状态
  • 暂停状态:当一个活动进入到暂停状态,与它关联的碎片就会进入暂停状态
  • 停止状态:当活动进入停止状态,与它关联的碎片就会进入停止状态,或通过FragmentTanscation的remove()、replace()方法将碎片从活动中移除,如果在事务提交前调用了addToBackStack()方法,这时碎片也会进入到停止状态,对用户完全不可见,可能被系统回收
  • 销毁状态:当活动被销毁,与它关联的碎片就会进入销毁状态。或通过FragmentTanscation的remove()、replace()方法将碎片从活动中移除,但在事务提交前没有调用addToBackStack()方法,这时碎片也会进入到销毁状态

附加的回调方法:

  • onAttach(): 当碎片和活动建立连接时调用
  • onCreateView(): 为碎片创建视图(加载布局)时调用
  • onActivityCreated(): 确保与碎片相关联的活动一定已经创建完毕的时候调用
  • onDestroyView(): 当与碎片关联的视图被移除的时候调用
  • onDetach(): 当碎片和活动解除关联的时候调用

4.2.2 碎片的生命周期

  • 添加碎片时: onAttach onCreate onCreateView onActivityCreated onStart onResume
    当碎片被/移除替换或点击返回键:
  • 调用addToBackStack()方法时:onPause onStop onDestroyView
  • 没有调用时:onPause onStop onDestroyView onDestroy onDetach
  • 当碎片重新回到屏幕时(借助addToBackStack()方法所以碎片在替换时没有被销毁,并不会执行onCreate()方法):onCreateView onActivityCreated
  • 当再次返回时:onPause onStop onDestroyView onDestroy onDetach

4.3动态加载布局

使用限定符(Qualifiers):

  1. 在res目录下新建layout-large目录,并且新建布局为activity_main.xml,布局为双页模式
  2. large为限定符,屏幕被认为是large的设备就会自动加载layout-large文件夹下的布局
  3. 使用最小宽度限定符,允许对屏幕的宽度指定一个最小值(以dp为单位),以这个最小值为临界点,大于这个值就加载一个布局,小于这个值就加载另一个布局
    在res目录下新建layout-sw400dp文件夹,并且新建activity_main.xml布局,意味着屏幕宽度大于400dp时,会加载layout-sw400dp/activity_main布局,当屏幕宽度小于400dp时,回加载默认的layout/activity_main布局。一个应用兼容不同的屏幕大小时,使用一个变量来标识是单页模式还是双页模式,如果是单页模式则启动新的activity,如果是双页模式则刷新Fragment中的内容即可(加载要显示的Fragment中的内容)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值