Android Fragment动态添加 FragmentTransaction FragmentManager
Fragment常用的三个类:
android.app.Fragment 主要用于定义Fragment
android.app.FragmentManager 主要用于在Activity中操作Fragment
android.app.FragmentTransaction 保证一些列Fragment操作的原子性
获取FragmentManage的方式:
getFragmentManager()
getSupportFragmentManager //v4中FragmentActivity
主要的操作都是FragmentTransaction的方法
FragmentTransaction transaction = fm.benginTransatcion();//开启一个事务
transaction.add() //往Activity中添加一个Fragment
transaction.remove() //从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
transaction.replace()//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体~
transaction.hide() //当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁,多的时候可能出现OOM异常,
transaction.show()//显示之前隐藏的Fragment
detach()会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护。
attach()重建view视图,附加到UI上并显示。
transatcion.commit()//提交一个事务
如果你喜欢使用Fragment,一定要清楚这些方法,哪个会销毁视图,哪个会销毁实例,哪个仅仅只是隐藏,这样才能更好的使用它们。
a、比如:我在FragmentA中的EditText填了一些数据,当切换到FragmentB时,如果希望会到A还能看到数据,则适合你的就是hide和show;
也就是说,希望保留用户操作的面板,你可以使用hide和show,当然了不要使劲在那new实例,进行下非null判断。
b、再比如:我不希望保留用户操作,你可以使用remove(),然后add();或者使用replace()这个和remove,add是相同的效果。
c、remove和detach有一点细微的区别,在不考虑回退栈的情况下,remove会销毁整个Fragment实例,而detach则只是销毁其视图结构,实例并不会被销毁。
那么二者怎么取舍使用呢?如果你的当前Activity一直存在,那么在不希望保留用户操作的时候,你可以优先使用detach。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.lesson10_fragment2.MainActivity"> <Button
android:id="@+id/btn_add"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="add"
android:text="添加Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_remove"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="remove"
android:text="移除Fragment"
android:textAllCaps="false" /> <Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="replace"
android:text="替换Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_attach"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="attach"
android:text="附加Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_detach"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="detach"
android:text="移除附加Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_show"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="show"
android:text="显示Fragment"
android:textAllCaps="false" /> <Button
android:id="@+id/btn_hide"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:onClick="hide"
android:text="隐藏Fragment"
android:textAllCaps="false" /> <!--动态加载,必须要给定一个空间用来加载Fragment 必须是一个FrameLayout !-->
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"> </FrameLayout>
</LinearLayout>
activity_main.xml
public class TextFragment extends Fragment {
@Override
public void onAttach(Context context) {
super.onAttach(context);
Log.e("TAG","----TextFragment-----onAttach");
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.e("TAG","----TextFragment-----onCreate");
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
Log.e("TAG","----TextFragment-----onCreateView");
EditText et = new EditText(getActivity());
et.setHint("动态加载的text");
return et;
}
@Override
public void onStart() {
super.onStart();
Log.e("TAG","----TextFragment-----onStart");
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
Log.e("TAG","----TextFragment-----onActivityCreated");
}
@Override
public void onResume() {
super.onResume();
Log.e("TAG","----TextFragment-----onResume");
}
@Override
public void onPause() {
super.onPause();
Log.e("TAG","----TextFragment-----onPause");
}
@Override
public void onStop() {
super.onStop();
Log.e("TAG","----TextFragment-----onStop");
}
@Override
public void onDestroyView() {
super.onDestroyView();
Log.e("TAG","----TextFragment-----onDestroyView");
}
@Override
public void onDestroy() {
super.onDestroy();
Log.e("TAG","----TextFragment-----onDestroy");
}
@Override
public void onDetach() {
super.onDetach();
Log.e("TAG","----TextFragment-----onDetach");
}
}
TextFragment.java
public class ImageFragment extends Fragment{
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
ImageView img = new ImageView(getActivity());
img.setImageResource(R.mipmap.ic_launcher);
return img;
}
}
ImageFragment.java
public class MainActivity extends AppCompatActivity {
TextFragment textFragment;
ImageFragment imgFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textFragment = new TextFragment();
imgFragment = new ImageFragment();
}
public void add(View v){
//创建事务
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//操作指令
ft.add(R.id.fl_content,textFragment);
//提交事务
ft.commit();
}
public void remove(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//从Activity中移除一个Fragment,如果被移除的Fragment没有添加到回退栈(回退栈后面会详细说),这个Fragment实例将会被销毁。
ft.remove(textFragment);
ft.commit();
}
public void replace(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//使用另一个Fragment替换当前的,实际上就是remove()然后add()的合体
ft.replace(R.id.fl_content,imgFragment);
ft.commit();
}
public void attach(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//重建视图,附件到UI上并显示
ft.attach(textFragment);
ft.commit();
}
public void detach(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//会将view从UI中移除,和remove()不同,此时fragment的状态依然由FragmentManager维护
ft.detach(textFragment);
ft.commit();
}
public void show(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//显示之前隐藏的Fragment
ft.show(textFragment);
ft.commit();
}
public void hide(View v){
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
//当你的fragment数量固定很少时隐藏当前的Fragment,仅仅是设为不可见,并不会销毁
ft.hide(textFragment);
ft.commit();
}
}
MainActivity.java
Android Fragment动态添加 FragmentTransaction FragmentManager的更多相关文章
- 009 Android Fragment动态用法(实现动态菜单栏)设置控件为满屏状态
·1.MainActivity采用线性布局 2.在app--->res--->layout,右击new--->xml---->layout xml FILE <1> ...
- Mono for android 如何动态添加View,线程内部如何更新UI.
貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...
- Android 如何动态添加 View 并显示在指定位置。
引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...
- Android Fragment的使用
定义 Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期.比Activity要轻量级,在程序内部做界面跳转要比Activity快的多. 静态添加 Fragment可以静 ...
- Android Fragment用法详解(2)--动态添加Fragment
在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...
- 使用Fragment 实现动态UI 和 动态添加Fragment
首先写好每个Fragment: 1.在第一个Fragment写一个按钮,使其加载下一个Fragment 布局: <LinearLayout xmlns:android="http:// ...
- Android学习——Fragment动态加载
动态加载原理 利用FragmentManager来添加一套Fragment事务,最后通过commit提交该事务来执行对Fragment的相关操作. FragmentManager fragmentma ...
- 【Android 开发教程】动态添加Fragments
本章节翻译自<Beginning-Android-4-Application-Development>,如有翻译不当的地方,敬请指出. 原书购买地址http://www.amazon.co ...
- 动态添加Fragment
在Fragment简单用法的基础上做修改 一.新建:another_right_fragment.xml <LinearLayout xmlns:android="http://sch ...
随机推荐
- SGU 112.a^b - b^a
题意: 如标题. 方法: 简单高精度... 代码(继续JAVA 水过) import java.util.*; import java.math.*; public class Solution { ...
- Codeforces 543D Road Improvement(DP)
题目链接 Solution 比较明显的树形DP模型. 首先可以先用一次DFS求出以1为根时,sum[i](以i为子树的根时,满足要求的子树的个数). 考虑将根从i变换到它的儿子j时,sum[i]产生的 ...
- JS判断是否为一个数组
function isArray(object){ return object && typeof object==='object' && Array == obje ...
- dedecms织梦导航栏二级菜单的实现方法
dede导航下拉菜单,一级栏目增加二级下拉菜单 使用dedecms5.6——5.7 将这段代码贴到templets\default\head.htm文件里<!-- //二级子类下拉菜单,考虑 ...
- Android 动画效果 及 自定义动画
1. View动画-透明动画效果2. View动画-旋转动画效果3. View动画-移动动画效果4. View动画-缩放动画效果5. View动画-动画效果混合6. View动画-动画效果侦听7. 自 ...
- python模块之paramiko
46.python模块之paramiko SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 2 3 4 5 6 7 8 9 10 11 12 13 ...
- python【第二篇】列表、元组、字典及文件操作
本节内容 列表 元组操作 字符串操作 字典操作 集合操作 文件操作 字符编码与转码 1.列表 列表是我们最以后最常用的数据类型之一,通过列表可以对数据实现最方便的存储.修改等操作:列表有序.可变.元素 ...
- intent.addFlags
一.Activity和Task(栈)的关系 Task就像一个容器,而Activity就相当与填充这个容器的东西,第一个东西(Activity)则会处于最下面,最后添加的东西(Activity)则会在 ...
- 对话Facebook人工智能实验室主任、深度学习专家Yann LeCun
对话Facebook人工智能实验室主任.深度学习专家Yann LeCun Yann LeCun(燕乐存),Facebook人工智能实验室主任,NYU数据科学中心创始人,计算机科学.神经科学.电子电气科 ...
- 苦练SOC“基本功”启明星辰九年磨一剑
2011年9月28日——10月31日,国内知名网络安全公司——启明星辰,作为协办方参与了51CTO在2011年举办的中国SOC安全管理平台市场应用现状调查. SOC(Security Operatio ...