Fragment入门

Fragment(碎片)

1.Fragment使用方式

  1. 新建leftFragment,rightFragment并继承Fragment
  2. 新建fragment_left.xml,fragment_right文件
  3. leftFragment重写onCraetView绑定xml文件
  4. 在main.xml中调用leftfragment(必须给一个id)

leftFragment:

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.fragment_left,container,false);
        return view;
    }
    
}

main.xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal">

    <fragment
        android:id="@+id/leftfragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.edu.cdp.fragmenttest.Fragment.leftFragment"
        android:layout_weight="1"/>

    <fragment
        android:id="@+id/rightfragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:name="com.edu.cdp.fragmenttest.Fragment.rightFragment"
        android:layout_weight="1"/>
        
</LinearLayout>

2.动态添加Fragment

  1. 创建待添加的碎片实例
  2. 获得FragmentManager,在Activity中可直接调用getSupportFragmentManager()方法得到
  3. 开启一个事务,通过调用beginTransaction()方法开启
  4. 想容器添加或替换Fragment,一般使用replace()方法来实现,需要传入容器id和待添加的碎片实例
  5. 提交事务,调用commit()方法来完成
@Override
public void onClick(View v) {
    replaceFragment(new leftFragment());
}

private void replaceFragment(Fragment fragment){
    FragmentManager fragmentManager=getSupportFragmentManager();//获得FragmentManager
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();//开启一个事务
    fragmentTransaction.replace(R.id.right_layout,fragment);//添加或者替换Fragment,传入容器id和fragment实例
    fragmentTransaction.commit();//提交事务
}

3.在碎片中模拟返回栈

上面打开了新的碎片之后点返回按钮就回直接退出,想实现Activity的返回栈可以调用,FragmentTransaction中提供了一个方法addToBackStack()方法,可以用于将一个事务添加到返回栈中

在事务提交之前调用addToBackStack()方法,它可以接受一个名字用于返回返回栈的状态,通常用null就好了

@Override
public void onClick(View v) {
    replaceFragment(new leftFragment());
}

private void replaceFragment(Fragment fragment){
    FragmentManager fragmentManager=getSupportFragmentManager();//获得FragmentManager
    FragmentTransaction fragmentTransaction=fragmentManager.beginTransaction();//开启一个事务
    fragmentTransaction.replace(R.id.right_layout,fragment);//添加或者替换Fragment,传入容器id和fragment实例
    fragmentTransaction.addToBackStack(null);//接受一个名字用于描述返回栈的状态
    fragmentTransaction.commit();//提交事务
}

4.碎片与活动之间的通信

为了方便碎片与活动之间进行通信,FragmentManger提供了一个类似findViewById的方法,专门用于从布局文件中获得碎片的实例

在Actvity获取Fragment实例

rightFragment rightFragment=(com.edu.cdp.fragmenttest.Fragment.rightFragment)getSupportFragmentManager().findFragmentById(R.id.right_layout);

在Fragment中获取Activity则直接使用getActivity()

活动向碎片传递数据可以调用Fragment实例的setArguments()方法

然后在碎片中调用getArguments()来获取到Bundle

碎片与碎片之间的通信可以通过Activity来实现


5.碎片的生命周期

alt碎片的生命周期

6.动态加载布局技巧

1.使用限定符

平板与手机屏幕大小不同所以使用的布局也不同,就需要判断程序在那些设备上使用不同的布局

  1. 在res下建一个layout-large的包,在其中新建一个activit-mian.xml文件
  2. 两个activity_mian.xml的布局不同
  3. 启动一个平板模拟器,在启动一个手机模拟器
  4. 可以看出不同

其中的large就是一个限定符,那些屏幕被认为是large的设备会自动加载layout_large文件下的布局,而小屏幕的设备还是会加载layout下的布局;

常用的限定符如下:

altFragment限定符

altFragment限定符

2.使用最小宽度限定符

当我们希望更加灵活的为不同设备加载布局,不管它是不是被系统认定为large这个值时,就可以使用最小宽度限定符。

最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,宽度小于这个值的设备就加载另一个宽度。

在res目录下新建一个layout_sw600dp文件加,然后在这个文件夹中新建xml文件;意味着当程序运行在屏幕宽度大于600dp的设备上时仍然加载默认的布局

posted @ 2021-08-13 13:46  踩红帽的小姑娘  阅读(58)  评论(0)    收藏  举报