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 ...
随机推荐
- laravel4通过控制视图模板路劲来动态切换主题
通过控制视图模板路劲来动态切换主题 App::before(function($request) { $paths = Terminal::isMobile() ? array(__dir__.'/v ...
- mysql锁死的现象判断
一般发生表锁死这种低级问题,就有两种情况:1.程序员水平太菜,2.程序逻辑错误. 一旦发生系统会出现超时,关键是有可能你看不到正在活动的php进程,而系统的慢查询日志也不会记录,只能通过show fu ...
- 翻译-让ng的$http服务与jQuerr.ajax()一样易用
Make AngularJS $http service behave like jQuery.ajax() 让ng的$http服务与jQuerr.ajax()一样易用 作者zeke There is ...
- php基础知识【函数】(2)文件file
一.路径 1.dirname -- 返回路径中的目录部分 $path = "/etc/passwd"; $file = dirname($path); // ...
- 利用python建表
(ENV)carlo@ubuntu:~/flasky$ python hello.py shell >>> from hello import db>>> db.d ...
- SVN简明使用方法 .
SVN简明使用方法 TortoiseSVN 是 Subversion 版本控制系统的一个免费开源客户端,可以超越时间的管理文件和目录.文件保存在中央版本库,除了能记住文件和目录的每次修改以外,版本库非 ...
- 跨进程发送消息数据(发送WM_COPYDATA消息,够简单的)
1 //1.发送窗体 2 procedure TForm2.Button1Click(Sender: TObject); 3 var 4 h: HWND; 5 Size: Integer; 6 Cop ...
- C++ STL的各种实现版本
ANSI/ISO的C++ STL规范版本正式通过以后,各个C++编译器厂商就可以依照标准所描述的原型去实现C++ STL泛型库,于是出现多种符合标准接口,但具体实现代码不同的泛型库,主要有: HP S ...
- mysql 监控长事务
mysql> desc information_schema.innodb_trx -> ; +----------------------------+----------------- ...
- Linux&shell 之Linux文件权限
写在前面:案例.常用.归类.解释说明.(By Jim) Linux文件权限用户useradd test (添加用户test)userdel test (删除用户test)passwd test(修改用 ...