Android学习路径(22)应用Fragment建立动态UI——构建一个灵活UI
当你设计你的应用来支持多个屏幕尺寸。你能够基于可用的屏幕空间通过在不同的布局上重用fragment来优化用户体验。
比如,在一个手机上。使用单面板(一次仅仅显示一个fragment)的用户体验更加合适。For example, on a handset device it might be appropriate to display just one fragment at a time for a single-pane user interface. 相反,你可能希望在一个可以展示很多其它信息的平板上设置并排摆放的fragments。
图 1. 同一个activity在不同的屏幕尺寸上展示的不同的fragment配置。在大尺寸屏幕上。两个fragment并排展示,而在小屏幕的设备上,一次仅仅能显示一个fragment。须要用户操作来切换它们。
FragmentManager
类提供了可以在执行时add,
remove, 以及 replace fragment的方法,这样就行创建一个动态的用户体验。
在执行时为Activity加入一个Fragment
不同于直接在activity的布局文件里定义fragments(像在上一课中展示的那样,使用,<fragment>元素)。你能够在activity执行时加入一个fragment。假设你打算在activity的生命周期期间更改fragment,那么这样做非常有必要。
要运行一个加入或者移除fragment操作,你必须使用FragmentManager
创建一个FragmentTransaction
,它提供了add,
remove, replace, 以及运行其它fragment事务的APIs。
假设你的activity同意fragments被移除或者替换。那么你须要在activity的onCreate()方法中加入初始化这些fragments的方法。
在使用fragment,特别是动态加入的fragment时,有一个重要的规则是fragment必须有一个容器视图,用作fragment的容器。
上一课中展示了一个一次显示一个fragment的布局,以下的布局是上一课中那个布局的可选项。
为了使用fragment之间的切换,这个activity布局中包括了一个空的FrameLayout
作为fragment的容器。
能够注意到这个文件名称和上一课中的文件名称同样,可是他的布局文件夹没有包括lager限定符,因此这个布局是给小的屏幕设备使用的,由于这种屏幕不适用同一时候展示两个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包的API,调用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
替换fragment的流程和加入fragment的流程十分相似,不同的是须要调用replace()
方法,而不是add()
方法。
要记住当你运行一个fragment事务时,比如替换或者移除一个,这一般会同意用户返回或者撤销这些改变。要同意用户退回一个fragment事务,你必须在提交fragment事务之前调用addToBackStack()
方法。
提示: 当你移除或者替换一个fragment而且加入这个事务到返回栈时,被移除的fragment将会被停止(而不是被销毁)。假设用户再返回到这个fragment,它会重新启动(而不是又一次创建)。假设你没有将它加入到返回栈,那么这个fragmen在被移除或者替换时就直接被销毁了。
替换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()
方法须要传入一个字符串类型的參数来指定这次事务的唯一名称。假设你打算不使用高级的fragment操作APIsFragmentManager.BackStackEntry
。这个名字是不是角色。
Android学习路径(22)应用Fragment建立动态UI——构建一个灵活UI的更多相关文章
- Android学习路径(七)建立Action Bar
在action bar最今本的形式中,它只在左边展示了activity的标题以及应用的icon. 即使在这样的简单的形式中,它也不过告诉用户如今在应用的哪个activity中,同一时候为你的应用保持一 ...
- 【Android Developers Training】 3. 构建一个简单UI
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- Android学习路径(23)应用Fragment建立动态UI——Fragment之间的通信
为了要重用Fragment的UI组件.你应该为它们每个都构建一个完整独立的,模块化的组件来定义他自身的布局和行为. 一旦你定义了这些可重用的Fragments.你能够通过activity关联它们同一时 ...
- 9) 十分钟学会android--使用Fragment建立动态UI
为了在 Android 上为用户提供动态的.多窗口的交互体验,需要将 UI 组件和 Activity 操作封装成模块进行使用,这样我们就可以在 Activity 中对这些模块进行切入切出操作.可以用 ...
- SSM(spring mvc+spring+mybatis)学习路径——2-2、spring MVC拦截器
目录 2-2 Spring MVC拦截器 第一章 概述 第二章 Spring mvc拦截器的实现 2-1 拦截器的工作原理 2-2 拦截器的实现 2-3 拦截器的方法介绍 2-4 多个拦截器应用 2- ...
- Android学习路径(四)文件项目学习的名单,android显示单元经常使用的
1.的该项目文件所谓名单AndroidManifest.xml文件.该文件,但有很大的利用,例:app名字.图标,app支持的版本app等等.以下我就介绍下这个清单文件的各个參数的作用. <ma ...
- Android学习笔记(十二)——实战:制作一个聊天界面
//此系列博文是<第一行Android代码>的学习笔记,如有错漏,欢迎指正! 运用简单的布局知识,我们可以来尝试制作一个聊天界面. 一.制作 Nine-Patch 图片 : Nine-Pa ...
- Android学习系列(22)--App主界面比较
本文算是一篇漫谈,谈一谈当前几个流行应用的主界面布局,找个经典的布局我们自己也来实现一个.不是为了追求到底有多难,而是为了明白我们确实需要这么做. 走个题,android的UI差异化市场依然很大,依然 ...
- Android学习笔记(十一)BroadcastReceiver动态注册、注销示例
在上一篇博文中简单介绍了一下BroadcastReceiver的相关知识点,本篇举一个在代码中动态的注册.注销BroadcastReceiver的栗子. 1.首先创建一个MyReceiver并继承Br ...
随机推荐
- Envelope
IEnvelope Interface Provides access to methods and properties of envelopes. Note: the IEnvelope inte ...
- mysql 查询字段名所在的表
select * from (select * from information_schema.COLUMNS where table_schema = '数据库名') temp where colu ...
- [D3] Convert Dates to Numeric Values with Time Scales in D3 v4
Mapping abstract values to visual representations is what data visualization is all about, and that’ ...
- Qt元类型(MetaType)注册门(使用qRegisterMetaType注册错误等级)
昨天调试项目时,突然发现如下消息: QObject::connect: Cannot queue arguments of type 'ERROR_LEVEL' (Make sure 'ERROR_L ...
- [内核编程] 4.1 技术原理 & 4.2 键盘过滤框架
4.1 技术原理 & 4.2 键盘过滤框架 4.1 预备知识 符号链接:符号链接其实就是一个“别名”.可以用一个不同的名字来代表一个设备对象(实际上),符号链接可以指向任何有名字的对象. Zw ...
- [RxJS] Split an RxJS observable with window
Mapping the values of an observable to many inner observables is not the only way to create a higher ...
- iOS开发之Quartz2D 二:绘制直线,曲线,圆弧,矩形,椭圆,圆
#import "DrawView.h" @implementation DrawView /** * 作用:专门用来绘图 * 什么时候调用:当View显示的时候调用 * @par ...
- .NET-架构优化实战-梳理篇
原文:.NET-架构优化实战-梳理篇 前言 程序员输出是他敲写的代码,那么输入就是他思考好的设计.因此不做设计是不存在,设计只分优秀的设计和糟糕的设计.为了避免过度设计浪费成本,需要针对现有业务与问题 ...
- OpenGL核心之视差映射
笔者介绍:姜雪伟,IT公司技术合伙人.IT高级讲师,CSDN社区专家,特邀编辑.畅销书作者;已出版书籍:<手把手教你¯的纹理坐标偏移T3来对fragment的纹理坐标进行位移.你能够看到随着深度 ...
- [Angular] FormBuildAPI
Using FormBuilder API can simply our code, for example we want to refactor following code by using F ...