《第一行代码》学习笔记——第四章 探究碎片


碎片Fragment是一种可以嵌入在活动中的UI片段。它能让程序更加合理和充分地利用大屏幕的空间。

碎片的使用方式

简单使用

  1. 新建left_fragment.xml:
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:text="Button"/>

</LinearLayout>
  1. 新建right_fragment.xml:
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:background="#00ff00"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:textSize="24sp"
        android:text="This is right fragment"/>

</LinearLayout>
  1. 新建LeftFragment和RightFragment类:
public class LeftFragment extends Fragment {

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.left_fragment, container, false);
        return view;
    }
}
  1. 在xml中使用Fragment:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <fragment
        android:id="@+id/left_fragment"
        android:name="com.lhh.fragmenttest.LeftFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/right_fragment"
        android:name="com.lhh.fragmenttest.RightFragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"/>

</LinearLayout>

动态添加碎片

示例代码:

	Fragment fragment = new RightFragment();
	FragmentManager manager = getSupportFragmentManager();
	FragmentTransaction transaction = manager.beginTransaction();
	transaction.replace(R.id.right_layout, fragment);
	transaction.commit();
  1. 新建待添加的Fragment实例
  2. 获取FragmentManager在活动中可以通过getSupportFragmentManager()方法获得
  3. 通过调用beginTransaction()方法开启一个事务
  4. 向容器内添加或替换碎片,一般使用replace()方法实现,需传入容器id和待添加的碎片实例
  5. 通过调用commit()方法提交事务

在碎片中模拟返回栈

	transaction.addToBackStack(null);

碎片和活动之间进行通信

为了方便碎片和活动之间进行通信,FragmentManager提供了findFragmentById()方法用于从布局文件中获取碎片实例:

RightFragment fragment = (RightFragment)getSupportFragmentManager().findFragmentById(R.id.right_fragment);

碎片可以通过调用getActivity()方法或的和当前碎片实例关联的活动实例:

MainActivity activity = (MainActivity)getActivity();

碎片的生命周期

碎片的状态

状态特点
运行状态碎片可见且关联的活动处于运行状态
暂停状态关联的活动进入暂停状态
停止状态关联的活动进入停止状态或碎片被移除,替换且之前被加入返回栈中
销毁状态关联的活动被销毁或碎片被移除,替换且之前未被加入返回栈中

碎片的生命周期回调

碎片的生命周期
活动中有的回调方法,碎片中几乎都有。碎片还提供了一些附加的回调方法:

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

动态加载布局技巧

使用限定符

修改activity_main.xml,仅保留左侧碎片,并充满父布局;在res目录下新建layout-large文件夹,在其中新建activity_main.xml,让其包含左右两个碎片。设备会根据屏幕尺寸自动选择要加载的布局。

限定符描述
small提供给小屏幕设备的资源
normal提供给中等屏幕设备的资源
large提供给大屏幕设备的资源
xlarge提供给超大屏幕设备的资源
ldpi提供给低分辨率设备的资源(<120dpi)
mdpi提供给中等分辨率设备的资源(120dpi~160dpi)
hdpi提供给高分辨率设备的资源(160dpi~240dpi)
xhdpi提供给超高分辨率设备的资源(240dpi~320dpi)
xxhdpi提供给超超高分辨率设备的资源(320dpi~480dpi)
land提供给横屏设备的资源
port提供给竖屏设备的资源

使用最小宽度限定符

最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以dp为单位),以此值为临界点,大于小于分别加载不同的布局。
在res目录下新建layout-sw600dp文件夹,则当程序运行在屏幕宽度大于等于600dp的设备上时会加载layout-sw600dp里的布局文件,小于时加载默认的layout里的布局文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值