Android官方开发文档Training系列课程中文版:使用Fragment构建动态UI之构建灵活的UI

原文地址:http://android.xsoftlab.net/training/basics/fragments/fragment-ui.html

当设计应用程序时需要支持尺寸较大的宽屏设备时,可以基于可用的屏幕空间在不同的布局中配置并重新使用fragment来提升用户体验。

举个例子,手持设备在同一时间可能只适合展示一个界面,相反的,你可能希望在平板设备上一边一个Fragment,因为平板有更宽的界面用来展示更多的信息。


上图中:两个Fragment,利用同一个Activity在不同的屏幕尺寸中展示出不同的界面效果。在大屏幕中,两个fragment一边一个,但是在手持设备上,只能在同一时间内放置一个fragment,所以只能在用户使用的时候使用替换的方式来展示另一个fragment。

类FragmentManager支持在运行时添加、删除、替换fragment,以便提供更灵活的体验。

在运行时添加Fragment到Activity中

正如上节课展示的那样,我们可以通过在布局文件中添加< fragment>标签的方式定义fragment,不过,我们还可以在activity运行的时候添加fragment到activity中。如果你计划在activity的生命周期内改变fragment的话,那么这项功能就很有必要了。

如果要执行类似添加、删除fragment的这种事务,必须通过使用FragmentManager创建一个事务对象FragmentTransaction,它提供了添加、删除、替换和其它fragment相关事务的功能。

如果activity允许fragment可以移除或者替换,那么必须在onCreate方法内初始化fragment并添加到activity中。

在处理fragment的时候有很重要的一条规则,尤其是在添加fragment的时候,就是activity必须包含一个容器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中调用getSupportFragmentManager()方法获得支持库中的FragmentManager对象,然后调用这个对象的beginTransaction()方法创建FragmentTransaction事务对象,通过这个事务对象的add()方法添加fragment。

你还可以使用FragmentTransaction事务对象执行多个fragment的事务。当准备确认要应用这些改变是,你应该调用commit()方法。

举个例子,下面这段代码展示了如何在上面的布局中添加fragment:

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 a new Fragment to be placed in the activity layoutHeadlinesFragment 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可以使用另一个不同的fragment来替换它,或者可以移除它。

替换Fragment

替换fragment的过程和添加的过程很相似,只是需要使用replace()方法而不是add()方法。

记住,在执行fragment事务的时候,比如替换或者移除,经常需要适当的允许用户可以通过返回撤销改变。为了通过fragment事务允许用户做到这一点,必须在FragmentTransaction事务提交之前调用addToBackStack()方法。

Note:当你通过移除或者替换将fragment作为事务添加到回退栈的时候,那个被移除的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()方法有一个可选的字符串参数,这个参数可以用来指定事务的唯一标示名称。这个名称不是必须的,除非你计划通过FragmentManager.BackStackEntry API执行更佳的fragment操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479295.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 669. 修剪二叉搜索树

1. 题目 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新的根节点。 来源&#xff1a;力扣&#xff08…

Pytorch翻车记录:单卡改多卡踩坑记!

文 | 哟林小平知乎先说明一下背景&#xff0c;目前正在魔改以下这篇论文的代码&#xff1a;https://github.com/QipengGuo/GraphWriter-DGLgithub.com由于每次完成实验需要5个小时&#xff08;baseline&#xff09;&#xff0c;自己的模型需要更久&#xff08;2倍&#xff09;&…

使用docker部署flask项目

前言 本次部署是把2个项目、mysql、redis、uwsgi封装在一个容器中&#xff0c;ngnix封装在一个容器中 实际应用中最好是&#xff1a; 项目和uwsgi封装在一个容器中mysql单独封装&#xff0c;可能还要读写分离&#xff0c;主从同步等redis单独封装&#xff0c;可能还要读写分离&…

论文浅尝 | DRUM:一种端到端的可微的知识图谱上的规则学习方法

论文笔记整理&#xff1a;张文&#xff0c;浙江大学在读博士&#xff0c;研究方向为知识图谱的表示学习&#xff0c;推理和可解释。现有的多数链接预测方法都不能处理新的实体&#xff0c;并且多为黑盒方法&#xff0c;使得其预测结果无法解释。本文提出了一种新的端到端的可微…

WSDM Cup 2019自然语言推理任务获奖解题思路

WSDM&#xff08;Web Search and Data Mining&#xff0c;读音为Wisdom&#xff09;是业界公认的高质量学术会议&#xff0c;注重前沿技术在工业界的落地应用&#xff0c;与SIGIR一起被称为信息检索领域的Top2。 刚刚在墨尔本结束的第12届WSDM大会传来一个好消息&#xff0c;由…

LeetCode 637. 二叉树的层平均值(层次遍历queue)

1. 题目 给定一个非空二叉树, 返回一个由每层节点平均值组成的数组. 输入:3/ \9 20/ \15 7 输出: [3, 14.5, 11] 解释: 第0层的平均值是 3, 第1层是 14.5, 第2层是 11. 因此返回 [3, 14.5, 11].2. 解题 queue按层遍历&#xff0c;每次进入循环记录队列长度n class So…

AI框架你只会调包,这种想法很危险!

深度学习神经网络正步入成熟&#xff0c;而深度学习框架目前众多&#xff0c;大都可以在图像识别、手写识别、视频识别、语音识别、目标识别和自然语言处理等诸多领域大显身手。深度学习框架平台占据人工智能产业生态的核心地位&#xff0c;具有统领产业进步节奏、带动终端场景…

Docker镜像大小

都说容器大法好&#xff0c;可是假设没有Docker镜像&#xff0c;Docker该是多无趣啊。 是否还记得第一个接触Docker的时候&#xff0c;你从Docker Hub下拉的那个镜像呢&#xff1f;在那个处女镜像的基础上。你执行了容器生涯的处女容器。镜像的基石作用已经非常明显。在Docker…

论文浅尝 | 机器阅读理解中常识知识的显式利用

论文笔记整理&#xff1a;吴林娟&#xff0c;天津大学硕士&#xff0c;自然语言处理方向。链接&#xff1a;https://arxiv.org/pdf/1809.03449.pdf动机机器阅读理解(MRC)和人类进行阅读理解之间还存在差距&#xff0c;作者认为主要体现在对于数据的需求和噪声鲁棒性上&#xff…

深度学习在美团配送ETA预估中的探索与实践

1.背景 ETA&#xff08;Estimated Time of Arrival&#xff0c;“预计送达时间”&#xff09;&#xff0c;即用户下单后&#xff0c;配送人员在多长时间内将外卖送达到用户手中。送达时间预测的结果&#xff0c;将会以”预计送达时间”的形式&#xff0c;展现在用户的客户端页面…

在AndroidStudio中配置Gradle进行 “动态编译期间,根据远程服务器地址 ,生成多类安装包”

原文地址&#xff1a;http://www.cnblogs.com/vir56k/p/4763810.html 需求&#xff1a; 在产品开发中&#xff0c;经常需要发布各个版本&#xff0c;每个版本的服务器地址有不同的服务器地址。比如 开发 服务器使用 192.168.1.232服务器&#xff0c;测试 服务器使用 192.168.1.…

中科院博士整理的机器学习算法知识手册,完整 PDF 开放下载!

分享一份中科院博士总结的机器学习算法知识手册&#xff0c;文章已打包成压缩文件&#xff0c;感兴趣的同学可下载交流。文件包含了&#xff1a;机器学习基础&#xff0c;监督学习方法、非监督学习方法&#xff0c;Python数据科学和深度学习等相关知识&#xff0c;若初学者在自…

论文浅尝 | 通过共享表示和结构化预测进行事件和事件时序关系的联合抽取

论文笔记整理&#xff1a;邓淑敏&#xff0c;浙江大学在读博士&#xff0c;研究方向为低资源条件下知识图谱自动化构建关键技术研究。Rujun Han, Qiang Ning, Nanyun Peng. Joint Event and Temporal Relation Extractionwith Shared Representations and Structured Predictio…

研发团队资源成本优化实践

背景 工程师主要面对的是技术挑战&#xff0c;更关注技术层面的目标。研发团队的管理者则会把实现项目成果和业务需求作为核心目标。实际项目中&#xff0c;研发团队所需资源&#xff08;比如物理机器、内存、硬盘、网络带宽等&#xff09;的成本&#xff0c;很容易被忽略&…

抖音算法推荐机制详解(科普向)

本文转载自公众号“夕小瑶的卖萌屋”&#xff0c;专业带逛互联网算法圈的神操作 -----》我是传送门 关注后&#xff0c;回复以下口令&#xff1a; 回复【789】 &#xff1a;领取深度学习全栈手册&#xff08;含NLP、CV海量综述、必刷论文解读&#xff09; 回复【入群】&#xf…

论文浅尝 | 融合多粒度信息和外部语言知识的中文关系抽取

论文笔记整理&#xff1a;吴涵&#xff0c;天津大学硕士&#xff0c;研究方向&#xff1a;自然语言处理Paper:https://www.aclweb.org/anthology/P19-1430/Code:https://github.com/thunlp/Chinese_NRE引入中文NER问题在很大程度上取决于分词的效果&#xff0c;所以在中文NER问…

智能写作

6.2万字报告剖析「智能写作」全貌&#xff0c;从落地产品看NLP商业化突破&#xff1a;

论文拒稿的评价可以有多狠?

文 | 自然卷知乎自古严师出高徒&#xff0c;“天将降大任于是人也&#xff0c;必先苦其心志&#xff0c;劳其筋骨……”。然而&#xff0c;这并不能作为审稿人走向“键盘侠”之路的理由&#xff01;让我们这些卑微投稿人心里真是好凉凉&#xff01;ಥ_ಥ 大家来看看&#xff0c…

全链路压测自动化实践

背景与意义 境内度假是一个低频、与节假日典型相关的业务&#xff0c;流量在节假日较平日会上涨五到十几倍&#xff0c;会给生产系统带来非常大的风险。因此&#xff0c;在2018年春节前&#xff0c;我们把整个境内度假业务接入了全链路压测&#xff0c;来系统性地评估容量和发现…

论文浅尝 | GMNN: Graph Markov Neural Networks

论文笔记整理&#xff1a;吴锐&#xff0c;东南大学硕士研究生&#xff0c;研究方向为自然语言处理来源&#xff1a;ICML 2019链接&#xff1a;http://proceedings.mlr.press/v97/qu19a/qu19a.pdf问题定义弱监督下的在关系数据中的对象分类。形式化地来说&#xff0c;给定一个图…