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 230. Weighings (拓扑排序)

    题意: 给出质量为1~n的n个箱子的m对轻重关系,输出一种可能的箱子的质量排列. Solution: 拓扑排序,注意要处理重边. #include <iostream> #include ...

  2. chromedriver release note

    ----------ChromeDriver v2.25 (2016-10-25)---------- Supports Chrome v53-55 Resolved issue 1547: Chro ...

  3. each函数循环数据表示列举,列举循环的时候添加dom的方法

    var dotBox = $('#bannerNum');var item = '<li></li>';var itemSize = $('#bannerBack p').le ...

  4. dedecms由子目录访问修改为根目录访问

    现在我需要将原来位于xampp/htdocs/zm下的网站修改到D:/lyh/webhome目录下访问,原来的访问路径为http://localhost/zm,现在为http://www.yihui. ...

  5. apache rewrite .htaccess 站点内容重定向实例

    <IfModule mod_rewrite.c> Options +FollowSymlinks RewriteEngine On RewriteCond %{REQUEST_FILENA ...

  6. 缓存淘汰算法---LRU

    1. LRU1.1. 原理 LRU(Least recently used,最近最少使用)算法根据数据的历史访问记录来进行淘汰数据,其核心思想是“如果数据最近被访问过,那么将来被访问的几率也更高”. ...

  7. WAMP中修改mysql默认空密码

    WAMP中如何修改mysql默认空密码 WAMP安装好后,mysql教程密码是为空的,那么要如何修改呢?其实很简单,通过几条指令就行了,下面我就一步步来操作.首先,通过WAMP打开mysql控制台.提 ...

  8. 使用windows live writer 编辑博客日志

    使用Windows Live Writer 编辑日志 一 意义 写博客日志是个需要坚持的好习惯.使用Windows Live Writer,能不受网页自带编辑器限制. Markdown支持.安装mar ...

  9. __attribute__ ((section(".text")))的测试

    一.测试原因 在学习u-boot的环境变量过程中,看到有如此的代码,现对涉及到的内容进行实验测试. 二.测试目的 1.了解gcc允许对段的属性进行更改的方法. 2.解决”ENV_IS_EMBEDDED ...

  10. Windows环境下安装PHPUnit

    Windows环境下安装PHPUnit,在此整理一下,以便大家参考. 本人测试安装环境:Windows7(win32) + Apache(2.2.13) + PHP(5.3.6) 1.    以管理员 ...