4.3 构建一个灵活的用户界面

当设计你的应用程序要支持大范围的屏幕尺寸时,你可以在不同的布局配置中重用碎片,来根据可用的屏幕空间优化用户体验。

例如,在手持设备上,它可能是适应来在一个单窗格用户界面一次只显示一个碎片。相反地,你可能要设置碎片并排地在具有更宽的屏幕尺寸的平板电脑上显示更多的信息给用户。

两个碎片,在不同的屏幕尺寸上同一个活动以不同的配置显示。在大屏幕上,两个碎片适合并排,但在手机设备上,适合在一次只有一个碎片,所以碎片必须在当用户浏览时互相代替。

FragmentManager类提供了一些方法,使您可以在活动运行时添加、移除和替换碎片,来创建一个动态的体验。

在运行时添加一个碎片到活动


不是在布局文件中定义活动的碎片——像上一课所示那样使用<fragment>元素——你可以在活动的运期间添加一个碎片到活动。如果你打算在活动的生命过程中改变碎片,这是必要的。

执行添加或删除碎片之类的事务,您必须使用FragmentManager创建一个 FragmentTransaction,它提供添加、删除、替换以及执行其它碎片事务的API。

如果你的活动允许碎片被移除或者替换,你应该在活动 的onCreate()方法添加初始的碎片到活动。

处理碎片——尤其是那些你在运行时添加的碎片——的一个重要原则是,碎片在布局中必须有一个容器视图,碎片的布局将驻留在该视图中。

下面的布局是在上节课展示的一次只显示一个碎片的布局的一个替代方案。为了用另一个碎片替换一个碎片,活动的布局包含一个空的FrameLayout作为碎片容器。

注意文件名跟在上节课中的布局文件是一样的,但布局目录不会large标识符,所以这个布局在设备屏幕小于large时使用,因为屏幕同一时间不适应两个碎片。

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" />

在您的活动内使用支持库API调用getSupportFragmentManager()得到一个 FragmentManager。然后调用BeginTransaction()创建一个FragmentTransaction并调用add()添加一个碎片。

您可以使用相同的FragmentTransaction对活动执行多个碎片事务。当你准备好提交变化时,你必须调用commit()方法

例如,下面添加一个碎片到之前的布局的方法:‘

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 an instance of ExampleFragment
            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();
        }
    }
}

由于碎片在运行时已被添加到FrameLayout容器——而不是在活动的布局使用<fragment> 元素定义它——活动可以移除碎片并用另一个不同的碎片替换它。

用另一个碎片替换碎片


替换一个碎片的过程跟添加一个类似,但需要replace()方法,而不是add()

请记住,当你执行碎片事务时,如替换或移除一个碎片,它通常应当允许用户导航回去并“撤消”变化。为了让用户可以在碎片事务导航回去,你必须在提交 FragmentTransaction之前调用addToBackStack()

注意:当您移除或替换一个碎片,并添加事务到后退堆栈,被移除的碎片是停止的(而不是被销毁)。如果用户导航回去恢复碎片,它会重新启动。如果你添加事务到后退堆栈,那么碎片在移除或替换时会被销毁。

用另一个碎片替换碎片的示例:

// 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来执行高级的碎片操作。

跟Google学习Android开发-起始篇-用碎片构建一个动态的用户界面(3)的更多相关文章

  1. 跟Google学习Android开发-起始篇-构建你的第一个应用程序(4)

    说明:此系列教程翻译自Google Android开发者官网的Training教程,利用Chome浏览器的自动翻译功能作初译,然后在一些语句不顺或容易造成误解的地方作局部修正.方便英文不好的开发者查看 ...

  2. 跟Google学习Android开发-起始篇-与其它应用程序交互(1)

    6 与其它应用程序交互 一个Android应用程序通常有多个活动.每一项活动都将显示一个用户界面,允许用户执行某种特定任务(如查看地图或者照片).为了把用户从一个活动带到另一个,你的应用必须使用Int ...

  3. 跟Google学习Android开发-起始篇-与其它应用程序交互(2)

    6.2从活动获取结果 启动另一个活动不必是单向的.您也可以启动另一个活动,并接收一个结果回来.为了接收一个结果,调用startActivityForResult()(而不是startActivity( ...

  4. 想学习Android开发

    最近被别人说知识面窄,心里受伤了.准备学学Android开发,如果能在手机里运行自己写的app,那是多么high ~~~ Android开发需要看什么资料呢? 说明:本人一直从事windows下的C+ ...

  5. android初级应用到高端架构教程------ 完整体系化学习android开发

    系统的学习android开发技术,从应用到底层,再到架构,告别乱糟糟的学习方式,不再是抓不住重点.从上到下贯通,全面学习android开发.让你拥有清晰的思路,一步步学习android开发! 一般而言 ...

  6. Android TV开发总结(三)构建一个TV app的焦点控制及遇到的坑

    转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52835829 前言:上篇中,&l ...

  7. iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一)

    iOS开发UI篇—使用UItableview完成一个简单的QQ好友列表(一) 一.项目结构和plist文件 二.实现代码 1.说明: 主控制器直接继承UITableViewController // ...

  8. Android TV开发总结(六)构建一个TV app的直播节目实例

    请尊重分享成果,转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/52966319 近年来,Android TV的迅速发展,传统的有线电视受 ...

  9. Android TV开发总结(七)构建一个TV app中的剧集列表控件

    原文:Android TV开发总结(七)构建一个TV app中的剧集列表控件 版权声明:我已委托"维权骑士"(rightknights.com)为我的文章进行维权行动.转载务必转载 ...

随机推荐

  1. vedeo与audio标签的使用

    浏览器原生支持音视频无疑是一件大事——尤其对移动设备而言.不依赖Flash,意味着更加省电.安全和快速的播放体验,而且只需要引入一个标签,就能播放自如. <video src="dao ...

  2. 简单Word操作

    //创建空白Word文档 private void button1_Click(object sender, EventArgs e) { object missing = Missing.Value ...

  3. 自定义UITableViewCell时, 使用autoLayout, 无法很好的做到屏幕适配

    解决方法: 重写cell的setFrame方法即可 - (void)setFrame:(CGRect)frame { frame.size.width = self.window.frame.size ...

  4. hdu1230火星A+B (大数题)

    Problem Description 读入两个不超过25位的火星正整数A和B,计算A+B.需要注意的是:在火星上,整数不是单一进制的,第n位的进制就是第n个素数.例如:地球上的10进制数2,在火星上 ...

  5. 服务器之间socket传输单链接和多连接测试结果

    今天做了一下测试,目的是看看局域网内服务器a,通过一个连接往服务器b传输数据,和通过多个连接传输的不同. 结果发现和多少个连接没关系,一个进程一个连接就能跑满网卡,只要write的时候够快,read的 ...

  6. CSS样式的面向对象思想(一)

    今天来谈一谈CSS样式的面向对象写法.顾名思义,面向对象是高级语言具备的特性,主要是为了程序高可复用,解决模块之间的耦合关系,那么像CSS这样的脚本语言是否也可以使用面向对象的思想,来提高代码的可维护 ...

  7. Web工程师的工具箱

    RequestBin:允许你创建一个URL,利用这款工具进行收集请求,然后通过个性化方式进行检查. Hurl:发出HTTP请求,输入URL,设置标题,查看响应,最后分享给其他人.类似的工具有:REST ...

  8. Thinkphp发布文章获取第一张图片为缩略图实现方法

    正则匹配图片地址获取第一张图片地址 此为函数 在模块或是全局Common文件夹中的function.php中 /** * [getPic description] * 获取文本中首张图片地址 * @p ...

  9. JavaScript错误处理

    JavaScript 错误 - Throw.Try 和 Catch JavaScript 测试和捕捉 try 语句允许我们定义在执行时进行错误测试的代码块. catch 语句允许我们定义当 try 代 ...

  10. js 点名

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...