Fragment入门
Fragment(碎片)
1.Fragment使用方式
- 新建leftFragment,rightFragment并继承Fragment
- 新建fragment_left.xml,fragment_right文件
- leftFragment重写onCraetView绑定xml文件
- 在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
- 创建待添加的碎片实例
- 获得FragmentManager,在Activity中可直接调用getSupportFragmentManager()方法得到
- 开启一个事务,通过调用beginTransaction()方法开启
- 想容器添加或替换Fragment,一般使用replace()方法来实现,需要传入容器id和待添加的碎片实例
- 提交事务,调用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.碎片的生命周期
6.动态加载布局技巧
1.使用限定符
平板与手机屏幕大小不同所以使用的布局也不同,就需要判断程序在那些设备上使用不同的布局
- 在res下建一个layout-large的包,在其中新建一个activit-mian.xml文件
- 两个activity_mian.xml的布局不同
- 启动一个平板模拟器,在启动一个手机模拟器
- 可以看出不同
其中的large就是一个限定符,那些屏幕被认为是large的设备会自动加载layout_large文件下的布局,而小屏幕的设备还是会加载layout下的布局;
常用的限定符如下:
2.使用最小宽度限定符
当我们希望更加灵活的为不同设备加载布局,不管它是不是被系统认定为large这个值时,就可以使用最小宽度限定符。
最小宽度限定符允许我们对屏幕的宽度指定一个最小值(以dp为单位),然后以这个最小值为临界点,屏幕宽度大于这个值的设备就加载一个布局,宽度小于这个值的设备就加载另一个宽度。
在res目录下新建一个layout_sw600dp文件加,然后在这个文件夹中新建xml文件;意味着当程序运行在屏幕宽度大于600dp的设备上时仍然加载默认的布局