android FragmentTransaction.replace的用法介绍

创建Fragment

Fragment和Activity有很多相似之处,例如可以不带UI,但这样做对两者似乎都没什么意义。他们的创建方式也很相似,例如下面的代码:

[html] view
plain
copyprint?

  1. package test.fragments;
  2. import android.app.Fragment;
  3. import android.os.Bundle;
  4. import android.view.LayoutInflater;
  5. import android.view.View;
  6. import android.view.ViewGroup;
  7. public class MySkeletonFragment extends Fragment {
  8. @Override
  9. public View onCreateView(LayoutInflater inflater,
  10.   ViewGroup container,
  11.   Bundle savedInstanceState) {
  12.   // Create, or inflate the Fragment’s UI, and return it.
  13.   // If this Fragment has no UI then return null.
  14.   return inflater.inflate(R.layout.my_fragment, container, false);
  15.   }
  16. }

Fragment生命周期

Fragment的生命周期和它的宿主Activity密切相关,几乎和宿主Activity的生命周期一致,他们之间最大的不同在于Activity可以增加或删除Fragment。下图总结了Fragment的生命周期:

Fragment特有的生命周期事件

  1. Attach and detach Fragment from the parent Activity
  2. Creating and destroying Fragment
  3. Creating and Destroying UI

获取Fragment Manager

每个Activity对象都内置了一个FragmentManager对象,使用getFragmentManager()即可获得:

FragmentManager fragmentManager = getFragmentManager();

添加Fragment到Activity中

在Activity中添加Fragment的最简单方法是使用layout配置文件,例如:

[html] view
plain
copyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.   android:orientation="horizontal"
  4.   android:layout_width="match_parent"
  5.   android:layout_height="match_parent">
  6.   <fragment android:name="com.paad.weatherstation.MyListFragment"
  7.   android:id="@+id/my_list_fragment"
  8.   android:layout_width="match_parent"
  9.   android:layout_height="match_parent"
  10.   android:layout_weight="1"
  11.   />
  12.   <fragment android:name="com.paad.weatherstation.DetailsFragment"
  13.   android:id="@+id/details_fragment"
  14.   android:layout_width="match_parent"
  15.   android:layout_height="match_parent"
  16.   android:layout_weight="3"
  17.   />
  18. </LinearLayout>

调用inflate方法生成Fragment的界面后,Fragment实际上是一个类似ViewGroup的角色,在Activity中管理自己的UI。

上面那种将Fragment添加到Activity的方法缺乏灵活性,不能实现动态地添加和删除,更好的方式是使用FragmentTranaction和类似下面这样的配置文件:

[html] view
plain
copyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.   android:orientation="horizontal"
  4.   android:layout_width="match_parent"
  5.   android:layout_height="match_parent">
  6.   <FrameLayout
  7.   android:id="@+id/ui_container"
  8.   android:layout_width="match_parent"
  9.   android:layout_height="match_parent"
  10.   android:layout_weight="1"
  11.   />
  12.   <FrameLayout
  13.   android:id="@+id/details_container"
  14.   android:layout_width="match_parent"
  15.   android:layout_height="match_parent"
  16.   android:layout_weight="3"
  17.   />
  18. </LinearLayout>

使用FragmentTransaction

FragmentTransaction可以在运行时添加,删除或替换Fragment,从而实现UI的动态变化。Fragment Transaction由Fragment Manager的beginTransaction()方法创建,然后可以进行Fragment的添加,删除和替换,最后通过commit()方法提交修改。

[java] view
plain
copyprint?

  1. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  2. // Add, remove, and/or replace Fragments.
  3. // Specify animations.
  4. // Add to back stack if required.
  5. fragmentTransaction.commit();

添加,删除和替换Fragment

使用FragmentTransaction的add方法可以添加一个新的Fragment,add()方法的主要参数是Fragment的容器View(或其ID)及Fragment实例,例如:

[java] view
plain
copyprint?

  1. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  2. fragmentTransaction.add(R.id.ui_container, new MyListFragment());
  3. fragmentTransaction.commit();

删除Fragment需要FragmentTransaction的remove()方法,参数为Fragment对象,Fragment对象可以通过FragmentManager的findFragmentById()方法获得。

[java] view
plain
copyprint?

  1. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  2. Fragment fragment = fragmentManager.findFragmentById(R.id.details_fragment);
  3. fragmentTransaction.remove(fragment);
  4. fragmentTransaction.commit();

替换Fragment使用的是FragmentTransaction的replace()方法,参数分别为所要替代Fragment所在容器的ID和新的Fragment:

[java] view
plain
copyprint?

  1. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  2. fragmentTransaction.replace(R.id.details_fragment, new DetailFragment(selected_index));
  3. fragmentTransaction.commit();

获取指定的Fragment

有两种方法可以获取某个特定的Fragment,如果这个Fragment已经被添加到某个layout文件中,则可以使用xml文件中的id作为参数:

[java] view
plain
copyprint?

  1. MyFragment myFragment = (MyFragment)fragmentManager.findFragmentById(R.id.MyFragment);

也可以通过创建Fragment时添加的tag获取特定的Fragment:

[java] view
plain
copyprint?

  1. MyFragment myFragment = (MyFragment)fragmentManager.findFragmentByTag(MY_FRAGMENT_TAG);

删除Fragment容器

在配置文件中将visibility的属性设为"gone",即可删除某个Fragment,例如:

[html] view
plain
copyprint?

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3.   android:orientation="horizontal"
  4.   android:layout_width="match_parent"
  5.   android:layout_height="match_parent">
  6.   <FrameLayout
  7.   android:id="@+id/ui_container"
  8.   android:layout_width="match_parent"
  9.   android:layout_height="match_parent"
  10.   android:layout_weight="1"
  11.   />
  12.   <FrameLayout
  13.   android:id="@+id/details_container"
  14.   android:layout_width="match_parent"
  15.   android:layout_height="match_parent"
  16.   android:layout_weight="3"
  17.   android:visibility="gone"
  18.   />
  19. </LinearLayout>

Fragment和Back Stack

Activity拥有Activity Stack,从而在用户按”返回”按钮时,回到前一个Activity。Fragment也可以响应”返回”事件,方法是FragmentTransaction在commit之前调用addToBackStack()方法。这样,在用户按返回键后,Android会首先重现之前的UI布局。

[java] view
plain
copyprint?

  1. FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
  2. fragmentTransaction.add(R.id.ui_container, new MyListFragment());
  3. Fragment fragment = fragmentManager.findFragmentById(R.id.details_fragment);
  4. fragmentTransaction.remove(fragment);
  5. String tag = null;
  6. fragmentTransaction.addToBackStack(tag);
  7. fragmentTransaction.commit();

原理和Activity类似,调用addToBackStack()后,Fragment会被push到back stack中,而不是销毁。

Fragment Transaction的动画效果

Fragment Transaction有两种方法实现动画效果,分别是:

  • 设置渐进:

transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);

  • 设置动画效果:

[java] view
plain
copyprint?

  1. fragmentTransaction.setCustomAnimations(R.animator.slide_in_left, R.animator.slide_out_right);

Fragment和宿主Activity之间的接口

Fragment可以通过getActivity()方法获得宿主Activity对象:

[java] view
plain
copyprint?

  1. TextView textView = (TextView)getActivity().findViewById(R.id.textview);

另一种常见的Fragment和Activity之间的交互方式是使用回调函数:

[java] view
plain
copyprint?

  1. <span style="font-size:12px">public interface OnSeasonSelectedListener {
  2.   public void onSeasonSelected(Season season);
  3. }
  4. private OnSeasonSelectedListener onSeasonSelectedListener;
  5.   private Season currentSeason;
  6.   @Override
  7.   public void onAttach(Activity activity) {
  8.   super.onAttach(activity);
  9.   try {
  10.   onSeasonSelectedListener = (OnSeasonSelectedListener)activity;
  11.   } catch (ClassCastException e) {
  12.   throw new ClassCastException(activity.toString() +"must implement OnSeasonSelectedListener");
  13.   }
  14.   }
  15.   private void setSeason(Season season) {
  16.   currentSeason = season;
  17.   onSeasonSelectedListener.onSeasonSelected(season);
  18. }</span>

没有UI的Fragment

尽管不常见,但Fragment的确是可以没有UI的,好处也许是拥有了更灵活的生命周期控制。没有UI的Fragment生命周期事件有这些:

[java] view
plain
copyprint?

  1. public class NewItemFragment extends Fragment {
  2.   @Override
  3.   public void onAttach(Activity activity) {
  4.   <span style="white-space:pre">    </span>super.onAttach(activity);
  5.  <span style="white-space:pre"> </span>// Get a type-safe reference to the parent Activity.
  6.   }
  7.   @Override
  8. public void onCreate(Bundle savedInstanceState) {
  9. <span style="white-space:pre">  </span>  super.onCreate(savedInstanceState);
  10. <span style="white-space:pre">  </span>  // Create background worker threads and tasks.
  11.   }
  12.   @Override
  13.   public void onActivityCreated(Bundle savedInstanceState) {
  14. <span style="white-space:pre">  </span>  super.onActivityCreated(savedInstanceState);
  15. <span style="white-space:pre">  </span>  // Initiate worker threads and tasks.
  16.   }
  17. }

常用的Fragment类

  • DiagFragment
  • ListFragment
  • webViewFragment
时间: 2024-12-18 02:11:57

android FragmentTransaction.replace的用法介绍的相关文章

MySQL replace into 用法详细介绍

MySQL replace into 用法(insert into 的增强版) 在向表中插入数据的时候,经常遇到这样的情况:1. 首先判断数据是否存在: 2. 如果不存在,则插入:3.如果存在,则更新. 在 SQL Server 中可以这样处理: if not exists (select 1 from t where id = 1) insert into t(id, update_time) values(1, getdate()) else update t set update_time

Android Fragment和FragmentActivity用法

Android Fragment是Android4.0以上才有的:而FragmentActivity是为了兼容4.0以下版本的Fragment使用的. 所以如果你想兼容4.0以下Android版本使用Fragment的话,框架Activity需要继承FragmentActivity,FragmentActivity这个类是在android.support.v4.app.FragmentActivity里的. 下面介绍2种用法: 1.继承Activity的. (这个只针对4.0以上的Android

(转)常用算法(Algorithm)的用法介绍

2算法部分主要由头文件<algorithm>,<numeric>和<functional>组成. 2<algorithm>是所有STL头文件中最大的一个,其中常用到的功能范围涉及到比较.交换.查找.遍历操作.复制.修改.反转.排序.合并等等. 2<numeric>体积很小,只包括几个在序列上面进行简单数学运算的模板函数,包括加法和乘法在序列上的一些操作. 2<functional>中则定义了一些模板类,用以声明函数对象. 2STL提供

Android中Fragment的简单介绍

Android是在Android 3.0 (API level 11)引入了Fragment的,中文翻译是片段或者成为碎片(个人理解),可以把Fragment当成Activity中的模块,这个模块有自己的布局,有自己的生命周期,单独处理自己的输入,在Activity运行的时候可以加载或者移除Fragment模块. 其中有个经典图,大家就字面上理解下就行: 可以把Fragment设计成可以在多个Activity中复用的模块,为了在Android上创建动态的.多窗口的用户交互体验,你需要将UI组件和

MyEclipse相关用法介绍

MyEclipse相关用法介绍 ================================================================================ 编辑: Ctrl+Shift+L      显示所有快捷键 Ctrl+K        参照选中的词(Word)快速定位到下一个 Ctrl+Shift+K      参照选中的词(Word)快速定位到上一个 Ctrl+O         快速显示OutLine Ctrl+T        快速显示当前类的

Android系统性能调优工具介绍

经作者授权,发表Tieto某青年牛的一篇<程序员>大作. Android系统性能调优工具介绍 在软件开发过程中,想必很多读者都遇到过系统性能问题.而解决系统性能问题的几个主要步骤是: 测评:对系统进行大量有针对性的测试,以得到合适的测试数据. 分析系统瓶颈:分析测试数据,找到其中的hotspot(热点,即bottleneck). 性能优化:对hotspot相关的代码进行优化. 由上述步骤可知,性能优化的目标对象是hotspot.如果找到的hotspot并非真正的热点,则性能优化的结果必然是事倍

解决fragmentTransaction.replace不能全屏

今天遇到个问题,使用fragmentTransaction.replace替换后的内容不能全屏.. FragmentManager fragmentManager = getSupportFragmentManager(); FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); Fragment playFragment = new ColumnFragment(); fragmentTrans

Android listview与adapter用法

listview与adapter用法 博客分类: android 一个ListView通常有两个职责. (1)将数据填充到布局. (2)处理用户的选择点击等操作. 第一点很好理解,ListView就是实现这个功能的.第二点也不难做到,在后面的学习中读者会发现,这非常简单. 一个ListView的创建需要3个元素. (1)ListView中的每一列的View. (2)填入View的数据或者图片等. (3)连接数据与ListView的适配器. 也就是说,要使用ListView,首先要了解什么是适配器

Android应用程序内存泄漏介绍

Android应用程序内存泄漏介绍 内存泄漏和内存溢出的区别 内存溢出(out of memory)是指程序在申请内存时,没有足够的内存空间供其使用,出现out of memory.比如在我们每个Android程序在运行时系统都会给程序分配一个一定的内存空间,当程序在运行中需要的内存超出这个限制就会报内存溢出(out of memory). 内存泄漏(memory leak)是指程序在申请内存后,无法释放已申请的内存空间.多次内存无法被释放,程序占用的内存会一直增加,直到超过系统的内存限制报内存