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的更多相关文章

  1. 009 Android Fragment动态用法(实现动态菜单栏)设置控件为满屏状态

    ·1.MainActivity采用线性布局 2.在app--->res--->layout,右击new--->xml---->layout xml FILE <1> ...

  2. Mono for android 如何动态添加View,线程内部如何更新UI.

    貌似所有设计到UI的程序原理都是一样的,子线程是不能够更新UI状态的,所以就必须使用UI自身或者第三方来更新UI. 如 在WinForm 中 就可以使用Control.Invoke(Action ac ...

  3. Android 如何动态添加 View 并显示在指定位置。

    引子 最近,在做产品的需求的时候,遇到 PM 要求在某个按钮上添加一个新手引导动画,引导用户去点击.作为 RD,我哗啦啦的就写好相关逻辑了.自测完成后,提测,PM Review 效果. 看完后,PM ...

  4. Android Fragment的使用

    定义 Fragment可以理解成一个迷你型的活动,同样可以包含布局,同样有自己的生命周期.比Activity要轻量级,在程序内部做界面跳转要比Activity快的多. 静态添加 Fragment可以静 ...

  5. Android Fragment用法详解(2)--动态添加Fragment

    在上一篇文章<Android Fragment用法详解(1)--静态使用Fragment>我们讲解了Fragment的最简单的用法.这次我们来说一说Fragment复杂一丢丢的用法.在代码 ...

  6. 使用Fragment 实现动态UI 和 动态添加Fragment

    首先写好每个Fragment: 1.在第一个Fragment写一个按钮,使其加载下一个Fragment 布局: <LinearLayout xmlns:android="http:// ...

  7. Android学习——Fragment动态加载

    动态加载原理 利用FragmentManager来添加一套Fragment事务,最后通过commit提交该事务来执行对Fragment的相关操作. FragmentManager fragmentma ...

  8. 【Android 开发教程】动态添加Fragments

    本章节翻译自<Beginning-Android-4-Application-Development>,如有翻译不当的地方,敬请指出. 原书购买地址http://www.amazon.co ...

  9. 动态添加Fragment

    在Fragment简单用法的基础上做修改 一.新建:another_right_fragment.xml <LinearLayout xmlns:android="http://sch ...

随机推荐

  1. SGU 159.Self-Replicating Numbers

    时间限制:0.5s 空间限制:6M 题意:         在b(2<b<36)进制中,找到所有长度为n(0<n<2000)的自守数k,满足k^2%b^n=k,字典序输出.   ...

  2. javascript——可以判断值的类型的函数

    function classof(o){ return Object.prototype.toString.call(0).slice(8,-1); } Function.prototype.getN ...

  3. 简单概述 .NET Framework 各版本区别

    目前已发行的版本有1.0.1.1.2.0.3.0.3.5.4.0.4.5(及4.5.1.4.5.2).4.6(及4.6.1). 1.0版本:最初的.net framework版本,作为一个独立的工具包 ...

  4. smarty中判断一个变量是否存在于一个数组中或是否存在于一个字符串中?

    smarty支持php的系统函数可以直接使用{if in_array($str, $arr) || strpos($str, $string)} yes {else} no{/if}

  5. sphinx ---rotate 运行机制

    如果sphinx在运行中,要indexer时,需要加上--rotate参数,这样索引完就直接生效了. 原因是sphinx的searchd在启动时会创建一个 .spl 锁文件,并在关闭时会删除它.在in ...

  6. Python自动化运维之30、Flask框架

    Flask 官网:http://flask.pocoo.org/ flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是 ...

  7. 那些年被我坑过的Python——摩拳擦掌(第三章)

    集合类型: 集合类型中的元素是唯一的! 集合的定义与赋值: set_1 = set([1, 3, 5, 7, 2]) set_2 = set([2, 4, 6, 8, 3]) 集合的运算操作 # 交集 ...

  8. Redmine配置

    官网步骤说明 http://www.redmine.org/projects/redmine/wiki/RedmineInstall 搭环境 1.MySql 2.RailsInstaller:Redm ...

  9. xamarin fivechess

    网上的五子棋项目是java开发,先转为xamarin,有需要的请下载. FiveChess.7z

  10. Unity C# 游戏间物体间的访问

    脚本语言:C# 1.在Unity工程中新建两个物体:Cube和Sphere 2.分别为Cube和Sphere添加脚本CubeScript和SphereScript: 在SphereScript这两个定 ...