【Android Developers Training】 21. 创建一个可变动的UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/basics/fragments/fragment-ui.html
当你在设计你的应用时,为了支持不同的屏幕尺寸,你可以在不同的布局配置中重用你的fragment,以此在可用的屏幕空间上获得最优化的用户体验。
例如,在一个手持设备上,以单一窗格每次只显示一个fragment也许是一个不错的选择。相对应的,你也许希望在屏幕更大的平板设备上并排显示多个fragment,为用户显示更多的信息。

图1. 两个fragment,在不同屏幕尺寸上隶属于同一个activity的显示效果。在大屏幕上,两个fragment可以同时并排显示。但在手持设备上,同一时间只能容纳一个fragment,所以当用户进行操作时,必须令fragment相互替换。
FragmentManager类提供了允许你在运行时为一个activity添加,删除和替换fragments的方法,以此来创建一个动态的用户体验。
一). 在运行时为一个activity添加一个fragment
与上一节课中在XML布局文件内通过<fragment>标签为一个activity定义一个fragment有所不同,你可以在运行时为一个activity添加一个fragment。如果你计划着在activity的生命周期过程中改变fragment,那么这么做是必要的。
为了实现诸如添加或删除一个fragment的事务,你必须使用FragmentManager来创建一个FragmentTransaction,它提供了添加,删除,替换fragment的APIs,同时还有其他fragment相关的事务。
如果你的activity允许fragments可以被删除或者替换,你应该在activity的onCreate()方法中,将初始化好的fragment添加至activity。
一个处理fragment时(尤其是你在运行时添加一个fragment)的关键的规则是:该fragment必须在布局中有一个View容器,fragment的布局将会放置于其中。
下面的布局是上一节课中所展示的布局的另一个形式,它在同一时刻只显示一个fragment。为了将一个fragment替换成另外一个,这个activity的布局包含了一个空的FrameLayout,它的作用相当于一个fragment容器。
注意到这里的文件名和上一节课中的那个例子是一样的,但是布局文件的目录路径中不包含“large”这一适配符,所以当当设备的屏幕比“large”这一规格要小时(此时屏幕无法同时装下两个fragment),这个布局就会被使用。
res/layout/news_articles.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragment_container"
android:layout_width="match_parent"
android:layout_height="match_parent" />
在你的Activity中,如果使用的是Support Library APIs,可以调用getSupportFragmentManager()来获得一个FragmentManager。之后调用beginTransaction()来创建一个FragmentTransaction,然后调用add()来添加一个fragment。
你可以通过使用相同的FragmentTransaction,来为这个activity执行多个fragment事务。当你决定要做出这样的改变,你必须在最后执行commit()。
例如:这是一个如何添加一个fragment至之前的布局的例子:
import android.os.Bundle;
import android.support.v4.app.FragmentActivity; public class MainActivity extends FragmentActivity {
@Override
public 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 FrameLayout
if (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 a new Fragment to be placed in the activity layout
HeadlinesFragment firstFragment = new HeadlinesFragment(); // In case this activity was started with special instructions from an
// Intent, pass the Intent's extras to the fragment as arguments
firstFragment.setArguments(getIntent().getExtras()); // Add the fragment to the 'fragment_container' FrameLayout
getSupportFragmentManager().beginTransaction()
.add(R.id.fragment_container, firstFragment).commit();
}
}
}
因为这个fragment已经在运行时被添加至FrameLayout这一容器,而不是在activity的布局中通过<fragment>标签进行定义的,所以activity可以用一个不同的fragment去替换它。
二). 用一个不同的fragment进行替换
替换一个fragment的过程和添加一个基本类似,区别在于需要的是replace()方法而不是add()方法。
记住当你执行一个fragment事务(比如替换或删除)时,最好允许用户可以进行撤销操作。为了实现用户的撤销,你必须在提交FragmentTransaction之前,执行addToBackStack()方法。
Note:
当你删除或者替换了一个fragment,然后将这个事务添加至后退栈(back stack),被删除的fragment会被停止(不是被销毁)。如果用户执行后退来恢复这个fragment,它会重新启动。如果你不将这个事务添加至后退栈,这个fragment会在被替换或被删除时直接被销毁。
一个替换fragment的例子:
// Create fragment and give it an argument specifying the article it should show
ArticleFragment 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 back
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null); // Commit the transaction
transaction.commit();
addToBackStack()方法接受一个可选的string参数,它用来为这个事务指定一个唯一的名字。这个名字不是必须的,除非你打算使用FragmentManager.BackStackEntry中的APIs来执行一些高阶fragment操作。
【Android Developers Training】 21. 创建一个可变动的UI的更多相关文章
- 【Android Developers Training】 19. 序言:通过Fragments构建动态UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 1. 创建一个Android项目工程
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 95. 创建一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 94. 创建一个空内容提供器(Content Provider)
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 93. 创建一个空验证器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 18. 重新创建一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 20. 创建一个Fragment
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 4. 启动另一个Activity
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- windows 上优雅的安装 node 和 npm
windows 的一键安装包,应该是最简单的 node 安装方式. 其实很多软件,拷贝过来就可以运行,根本不需要所谓的"安装"过程. 新建一个目录专门了管理 node 和 npm ...
- java关键字transient与volatile小结
本文转自:http://heaven-arch.iteye.com/blog/1160693 transient和volatile两个关键字一个用于对象序列化,一个用于线程同步,都是Java中比较高阶 ...
- 18、面向对象基本原则及UML类图简介
18.1.面向对象基本原则 18.1.1.面向抽象原则 抽象类特点: a.抽象类中可以有abstract方法,也可以有非abstract方法. b.抽象类不能用new运算符创建对象. c.如果一个非抽 ...
- 12、借助Jacob实现Java打印报表(Excel、Word)
12.使用Jacob来处理文档 Word或Excel程序是以一种COM组件形式存在的.如果能够在Java中调用相应组件,便能使用它的方法来获取文档中的文本信息.Jacob是一个JAVA到微软的COM接 ...
- python csv例子
import csv fieldnames = ['Column1', 'Column2', 'Column3', 'Column4'] rows = [{'Column1': '0', 'Colum ...
- Java反射机制剖析(二)-功能以及举例
从<java反射机制剖析(一)>的API我们看到了许多接口和类,我们能够通过这些接口做些什么呢? 从上篇API中我们能看到它能够完成下面的这些功能: 1) 获得类 A. 运 ...
- Python教程(2.5)——控制台输入
写Python程序时,你可能希望用户与程序有所交互.例如你可能希望用户输入一些信息,这样就可以让程序的扩展性提高. 这一节我们来谈一谈Python的控制台输入. 输入字符串 Python提供一个叫做i ...
- JVM-1.编译
目录 一.编译器概述 二.编译器组成 三.示例 四.深入理解JVM中的编译器 五.语法糖 六.补充 一.编译器概述 1.编译器实质 编译器的实质是将一种语言规范转化为另一种语言规范:由人容易理 ...
- Centos 执行shell命令返回127错误
shell脚本功能:连接mysql,自动创建数据库,脚本如下 mysql -h$MYSQL_IP -u$MYSQL_USER -p$MYSQL_PASSWORD --default-character ...
- bootstrapValidator 使用(包含入门demo,常用方法,以及常用的规则)
一 什么是bootstrapValidator? -- 一个基于 jquery,boostrap 的表单验证框架....简单实用上手快,页面美观还过得去,不废话了,直接撸. 二 boots ...