当activity运行时添加fragment(fragment应用的第二种方法)

el/2024/7/17 20:44:17

你设计支持广泛屏幕大小的应用时,你可以在不同的布局配置中重用你的frament,在可用的屏幕空间基础上优化用户体验。
例如,在手持设备上,对于一个单窗口的用户界面来说同一时间可能只适合显示一个fragment。反之,你可能想在尺寸更大平板上并排设置更多的fragment以显示更多的信息给用户.

如上图:两个fragment,同一个activity,不同的配置,显示在不同的屏幕尺寸上。在大的屏幕中,两个fragment可以并排的占用屏幕,但是在手持设备中,在同一时间,仅仅只能填充一个fragment,两个fragment必须随着用户的操作相互替换。
为创建一个动态的体验,FragmentManager类提供了方法允许你在activity运行时对fragment进行添加,移除,和替换。

Add a Fragment to an Activity at Runtime


相比上节课提到的使用标签在布局文件中为activity定义一个fragment组件,更好的方式是在activity运行时添加fragment。如果你想在activity的生命周期中变换fragment的话就必须这样做。

执行类似添加或者删除fragment的事务,你必须使用FragmentManager创建一个FragmentTransaction,它提供了添加,删除以及其他fragment事务的API。



如果你的activity允许移除或者替换fragment,你应该在activity的onCreate()方法中添加初始化的fragment。



在你处理fragment(尤其是你在运行时添加的那些)的时候,有一个很重要的规则就是你的fragment放置位置的布局中必须有一个视图容器。



下面这个布局是在上节课同一时间只显示一个fragment布局的替代品。为了将一个fragment替换成另一个,这个activity布局包含了一个空的FrameLayout作为fragment容器。
注意这个文件名跟上节课的布局文件名字一样,但是这个布局并没有指定在“高分辨率”目录中(译者注:请注意下面xml的路径,res/layout这个layout文件夹并没有像上节课提到的是一个layout-large文件夹),如此这个布局是用在比large更小的设备屏幕上,因为这个屏幕不能在同一时间充满两个fragment。



res/layout/news_articles.xml:

[html]  view plain copy
  1. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  2. android:id="@+id/fragment_container"  
  3. android:layout_width="match_parent"  
  4. android:layout_height="match_parent" />  

在你的activity中,使用Support LibraryAPI,调用getSupportFragmentManager()可以得到一个FragmentManager对象之后调用beginTransaction去创建一个FragmentTransaction对象,再调用add()方法即可添加一个fragment。
你可以对activity使用同一个FragmentTransaction对象去执行多个fragment事务,当你确定要做这些操作时,你必须调用 commit()方法。



例如,以下代码演示怎样添加一个fragment到前面的layout:


 123456789
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
    import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);// Check that the activity is using the layout version with// the fragment_container FrameLayoutif (findViewById(R.id.fragment_container) != null) {// However, if we're being restored from a previous state,// then we don't need to do anything and should return or else// we could end up with overlapping fragments.if (savedInstanceState != null) {return;}// Create an instance of ExampleFragmentHeadlinesFragment firstFragment = new HeadlinesFragment();// In case this activity was started with special instructions from an Intent,// pass the Intent's extras to the fragment as argumentsfirstFragment.setArguments(getIntent().getExtras());// Add the fragment to the 'fragment_container' FrameLayoutgetSupportFragmentManager().beginTransaction().add(R.id.fragment_container, firstFragment).commit();//上一个代码区的容器}}}


由于fragment是在运行时添加到FrameLayout,而不是直接使用标签定义在activity的布局中,activity可以移除它或者使用另外一个不同的fragment替换它。


使用另一个fragment替换当前(Replace One Fragment with Another)* ##


替换一个fragment的过程跟添加差不多,但是需要的是replace()方法,而不是add()方法。
需要注意的是,当你执行fragment事务时,比如替换或者删除一个fragment。允许用户“后退”或者“撤销”改变通常是比较合适的做法。为了让用户可以通过fragment事务“后退”,你必须在你提交fragment事务之前调用addToBackStack()方法。


注意当你移除或者替换fragment且将事务添加到堆栈中时被移除的fragment是被停止了(没有消亡)。如果用户导航回来重新加载这个fragment,它将会重新启动;如果你没有把事务加入到堆栈中,当fragment被删除或者替换时,这个fragment也就消亡了;


以下使用fragment替换另一个的例子:

 123456789
10
11
12
13
14
15
    // Create fragment and give it an argument specifying the article it should showArticleFragment newFragment = new ArticleFragment();Bundle args = new Bundle();args.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();// Replace whatever is in the fragment_container view with this fragment,// and add the transaction to the back stack so the user can navigate backtransaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);// Commit the transactiontransaction.commit();

addToBackStack()方法有一个可选的字符串参数,用来指定事务的唯一名称。这个名称不是必须的除非你打算使用FragmentManager.BackStackEntry API执行更高级的fragment操作。





http://www.ngui.cc/el/5557182.html

相关文章

activity运行时添加fragment(第二种方式使用fragment)

你设计支持广泛屏幕大小的应用时&#xff0c;你可以在不同的布局配置中重用你的frament&#xff0c;在可用的屏幕空间基础上优化用户体验。 例如&#xff0c;在手持设备上&#xff0c;对于一个单窗口的用户界面来说同一时间可能只适合显示一个fragment。反之&#xff0c;你可能…

Android修改最小SDK版本(minSdkVersion)

修改最小SDK版本(minSdkVersion) 版本: Android Studio 1.4.1 因为Android的一些特定功能需要高版本的支持, 当最小SDK版本(minSdkVersion)过低时, 会出现报错, 所以要修改; 如果在Eclipse中, 修改Manifest属性即可; Android Studio使用gradle进行构建, 所以需要修改gradle…

Android仿微信气泡聊天界面设计(二)

微信的气泡聊天是仿iPhone自带短信而设计出来的&#xff0c;不过感觉还不错可以尝试一下仿着微信的气泡聊天做一个Demo&#xff0c;给大家分享一下&#xff01;效果图如下&#xff1a; 气泡聊天最终要的是素材&#xff0c;要用到9.png文件的素材&#xff0c;这样气泡会随着聊天…

hadoop mkdir: Cannot create directory /usr. Name node is in safe mode.

离开安全模式方法 bin/hadoop dfsadmin -safemode leave 若不处理安全模式的话&#xff0c;web服务无法启动&#xff0c;dfsadmin report结果异常

hadoop2.7.1使用dfs命令的错误(bin/hdfs dfs -mkidr input的错误)

. 离开安全模式方法 bin/hadoop dfsadmin -safemode leave hadoop2.7.1 相对路径不能用&#xff0c;似乎必须用绝对路径创建&#xff1f;&#xff1f;&#xff1f;&#xff1f; bin/hdfs dfs -mkdir input错误 提示“ls: input: No such file or directory” &#xff08;环境…

android存储之preference和SQLite

android preference&#xff1a; 在android中&#xff0c;最简单的持久化数据的办法是使用Preferences API&#xff0c;获取preference对象有三种方式&#xff0c;都是通过Activity对象的方法&#xff0c;获取的是android.content.SharedPreferences对象实例。 getPreferences(…

Android Manifest.xml中application功能和重写

android:name属性是用来设置所有activity 属于哪个application的&#xff0c;默认是android.app.Application。 当然也可以自己定义一个类&#xff0c;例如&#xff1a; public class TestApplication extends Application {} 这个类的作用是为了放一些全局的和一些上下文都要用…

android 如何设置窗体特性getWindow().setFlags

//设置窗体全屏 getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); //设置窗体始终点亮 getWindow().setFlags(WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON, WindowManager.LayoutParams.FLAG_KEEP_SCREEN…

Android Design Support Library 中控件的使用简单介绍(一)

介绍 在这个 Lib 中主要包含了 8 个新的 material design 组件&#xff01;最低支持 Android 2.1 。 这些组件在我看来就是对 Github中最近比较火的 android 组件进行了封装&#xff01;&#xff01; 使用 第一步--引用 引用这个库&#xff1a;在 build.gradle 文件中加上这段代…

Android 当overridePendingTransition遇见了Fragment

overridePendingTransition 在startActivity&#xff08;&#xff09;或finish&#xff08;&#xff09;后&#xff0c;调用overridePendingTransition &#xff08;R.anim.**in,R.anim.**out&#xff09;方法. 一)实现淡入淡出的效果如下: startActivity(new Intent(SplashAct…