Fragment简单认识
1.简介
- 在大屏幕设备上支持更加动态和灵活的UI设计
- 就是一种卡片的设计思路
- 一个Activity可以有多个Fragment,一个Fragment可以被多个Activity使用
- 可以进行动态的添加,替换和删除
- Fragment有着自己的生命周期,同时受到Activity的影响
2.创建方式
2.1分类
- 静态
- 动态
2.2Fragment静态创建
1.方法介绍
*LayoutInflater将布局文件实例化,子布局
* container父容器的ViewGroup,父布局
*Bundle,保存Fragment的状态信息的,可以恢复启动的数据
* false的含义是否将该布局放到作为父布局container中。
* true表示该布局是附着在container中的,返回父布局的view,
* false表示该布局不附着在container中,返回第一个参数对应的布局。
注意fragment标签中必须设置name属性和id属性
2.3静态创建案例:
1)Fragment代码
public class BlankFragment extends Fragment {
/*
*LayoutInflater将布局文件实例化,子布局
* container父容器的ViewGroup,父布局
*Bundle,保存Fragment的状态信息的,可以恢复启动的数据
* false的含义是否将该布局放到作为父布局container中。
* true表示该布局是附着在container中的,返回父布局的view,
* false表示该布局不附着在container中,返回第一个参数对应的布局。
* */
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_blank, container, false);
}
}
2)Fragment布局
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:gravity="center"
android:textColor="@color/red"
android:text="我是Fragment" />
3)Activity布局文件(静态创建直接使用fragment标签)
- 必须设置name属性和id属性
<!-- 必须设置name属性和id属性-->
<fragment
android:id="@+id/testf"
android:name="com.lxz.review2.BlankFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
4)效果图
2.4Fragment动态创建
1.简介
- 不适用标签使用代码的形式进行创建的方式
- fragment变成了一个空间
2.步骤
- 创建Fragment
- 获取manager对象,getSupportFragmentManager()
- 获取事务对象,getSupportFragmentManager().beginTrasction();
- 进行增删改,add(),replace(),remove()
- 提交事务
2.5动态创建案例:
1)activity代码
FragmentManager manager= getFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
Fragment fragment=new BlankFragment2();
transaction.add(R.id.f,fragment);
transaction.commit();
2)activit对应的布局文件
<LinearLayout
android:id="@+id/f"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
3)fragment的布局
public class BlankFragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_blank2, container, false);
}
}
4)fragment的Java代码
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:textSize="30dp"
android:gravity="center"
android:textColor="@color/green"
android:text="我是动态创建Fragment" />
2.6扩展案例:移除操作
1)布局文件
<LinearLayout
android:id="@+id/f"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
>
</LinearLayout>
<Button
android:onClick="removeFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="移除Fragment"
/>
<Button
android:onClick="detchFragment"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="移除Fragment"
/>
2)Java代码
// remove移除
public void removeFragment(View view){
FragmentManager manager= getFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
Fragment fragment=manager.findFragmentById(R.id.f);
if (fragment!=null)
{
transaction.remove(fragment);
transaction.commit();
}
}
//detch移除
public void detchFragment(View view) {
FragmentManager manager= getFragmentManager();
FragmentTransaction transaction= manager.beginTransaction();
Fragment fragment=manager.findFragmentById(R.id.f);
transaction.detach(fragment);
transaction.commit();
}
图1 删除前
图2 删除后
2.6知识扩展
1.add()方法的主要参数是Fragment的容器View(或其ID)及Fragment实例
2.替换Fragment使用的是FragmentTransaction的replace()方法,参数分别为所要替代Fragment所在容器的ID和新的Fragment:
3.删除Fragment需要FragmentTransaction的remove()方法,参数为Fragment对象,4.Fragment对象可以通过FragmentManager的findFragmentById()方法获得。
5.add():向Activity加入一个片段,这个片段在activity容器中有他自己的视图。
6.hide():隐藏已经存在的Fragment,但是仅仅对已经添加到父容器中的Fragment有关,7.隐藏Fragment的Viewshow():显示一个以前被隐藏的Fragment,这仅仅对已经添加到activity中的Fragment有关,显示Fragment的Viewdetach():Fragment的视图被销毁,但是它的状态没有被销毁,还是被fragment manager管理。
8.attach():Fragment的view重新加载到UI视图中,并显示,也就是执行onCreateView()→onActivityCreate()→onStart()→onResume()replace():就相当于执行remove(Fragment)→add(int, Fragment, String)这两个方法
9.hide()方法仅仅是隐藏了Fragment的View,而没有销毁View,show()方法仅仅是显示之前隐藏的View。
10.replace()是先remove(Fragment),然后add(Fragment),这样会导致fragment的重新创建。
11.detach()是将Fragment的视图销毁,Fragment的状态没有被销毁,还是被FragmentMenager管理。
3.Fragmeny的生命周期
1.生命周期函数
- onAttach(Context context):fragment附加到Activity时调用,context就是当前的Activity的对象
- onCreate():系统创建Fragment对象后回调该方法,实现代码中只初始化想要在Fragment中保持的必要控件,当Fragment被暂停或者停止后可以恢复。
- onCreateView():当Activity要得到Fragment的layout时,会回调该方法,Fragment在其中创建自己的layout界面。该方法必须返回一个View,该View也就是该Fragment要显示的view。
- onActivityCreated():当Fragment所在的Activity被启动完成后回调该方法。
- onStart():启动Fragment时被回调
- onResume():Fragment进入前台获得焦点时被回调,onStart()方法后一定会回调onResume()方法。
- onPause():暂停该Fragment时将会回调该方法。
- onStop():停止Fragment时被回调
- onDestroyView():销毁该Fragment所包含的View时被调用。
- onDestroy():销毁该Fragment。
- onDetach():将该Fragment从Activity中解除关联。onDestroy方法一定会回调onDetach()方法。