构建灵活的界面

在设计支持各种屏幕尺寸的应用时,你可以在不同的布局配置中重复使用 Fragment ,以便根据相应的屏幕空间提供更出色的用户体验。

例如,一次只显示一个 Fragment 可能就很适合手机这种单窗格界面,但在平板电脑上,你可能需要设置并列的 Fragment,因为平板电脑的屏幕尺寸较宽阔,可向用户显示更多信息。

图 1: 两个 Fragment,显示在不同尺寸屏幕上同一 Activity 的不同配置中。在较宽阔的屏幕上,两个 Fragment 可并列显示;在手机上,一次只能显示一个 Fragment,因此必须在用户导航时更换 Fragment。

利用 FragmentManager 类提供的方法,你可以在运行时添加、移除和替换 Activity 中的 Fragment,以便为用户提供一种动态体验。

在运行时向 Activity 添加 Fragment



你可以在 Activity 运行时向其添加 Fragment,而不用像上一课中介绍的那样,使用 <fragment> 元素在布局文件中为 Activity 定义 Fragment。如果你打算在 Activity 运行周期内更改 Fragment,就必须这样做。

要执行添加或移除 Fragment 等事务,你必须使用 FragmentManager 创建一个 FragmentTransaction,后者可提供用于执行添加、移除、替换以及其他 Fragment 事务的 API。

如果 Activity 中的 Fragment 可以移除和替换,你应在调用 Activity 的 onCreate() 方法期间为 Activity 添加初始 Fragment(s)。

在处理 Fragment(特别是在运行时添加的 Fragment )时,请谨记以下重要规则:必须在布局中为 Fragment 提供 View 容器,以便保存 Fragment 的布局。

下面是上一课所示布局的替代布局,这种布局一次只会显示一个 Fragment。要用一个 Fragment 替换另一个 Fragment, Activity 的布局中需要包含一个作为 Fragment 容器的空 FrameLayout

请注意,该文件名与上一课中布局文件的名称相同,但布局目录没有 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 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);

            // 确认 Activity 使用的布局版本包含            // fragment_container FrameLayout            if (findViewById(R.id.fragment_container) != null) {

                // 不过,如果我们要从先前的状态还原,                // 则无需执行任何操作而应返回                // 否则就会得到重叠的 Fragment 。                if (savedInstanceState != null) {                    return;                }

                // 创建一个要放入 Activity 布局中的新 Fragment                 HeadlinesFragment firstFragment = new HeadlinesFragment();

                // 如果此 Activity 是通过 Intent 发出的特殊指令来启动的,                // 请将该 Intent 的 extras 以参数形式传递给该 Fragment                 firstFragment.setArguments(getIntent().getExtras());

                // 将该 Fragment 添加到“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(),然后再执行 FragmentTransaction

注意:当你移除或替换 Fragment 并向返回堆栈添加事务时,已移除的 Fragment 会停止(而不是销毁)。如果用户向后导航,还原该 Fragment,它会重新启动。如果你没有向返回堆栈添加事务,那么该 Fragment 在移除或替换时就会被销毁。

替换 Fragment 的示例:

    // 创建 Fragment 并为其添加一个参数,用来指定应显示的文章    ArticleFragment newFragment = new ArticleFragment();    Bundle args = new Bundle();    args.putInt(ArticleFragment.ARG_POSITION, position);    newFragment.setArguments(args);

    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();

    // 将 fragment_container View 中的内容替换为此 Fragment ,    // 然后将该事务添加到返回堆栈,以便用户可以向后导航    transaction.replace(R.id.fragment_container, newFragment);    transaction.addToBackStack(null);

    // 执行事务    transaction.commit();    

addToBackStack() 方法可接受可选的字符串参数,来为事务指定独一无二的名称。除非你打算使用 FragmentManager.BackStackEntry API 执行高级 Fragment 操作,否则无需使用此名称。

时间: 2024-08-09 23:51:35

构建灵活的界面的相关文章

用FlexboxLayout构建灵活的布局

在去年的Google I/O大会上,Google发布了 ConstraintLayout他使我们能够使用一个平面的视图层次来构建复杂的界面布局.android studio的视图编辑器也对其实现了完整支持. 与此同时,Google开源了FlexboxLayout 他与CSS Flexible布局模块具有相同的功能.接下来的例子我们将使用FlexboxLayout实现一些特殊的功能. 你可以把FlexboxLayout理解成一个高级的LinearLayout,他和LinearLayout一样都是在

Android UI开发——使用Fragment构建灵活的桌面

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google  IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的布局文件实现的.当设计应用程序,你可以在不同的布局结构中重复使用Fragment,以支持众多的屏幕尺寸,,在可用的屏幕空间上优化用户体验.例如在手持设备(如Nexus 4)上,一个屏显示一个Fragment,在更大屏(如Nexus 7)上可以使用多个Fr

Android官方入门文档[17]构建灵活的UI

Android官方入门文档[17]构建灵活的UI Building a Flexible UI构建灵活的UI This lesson teaches you to1.Add a Fragment to an Activity at Runtime2.Replace One Fragment with Another You should also read?Fragments?Supporting Tablets and Handsets这节课教你1.在运行时新增一个片段给一个活动2.用另一片段

Android UI开发第三十篇——使用Fragment构建灵活的桌面

摘要: 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏.10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里 ... 当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏.7寸屏. 10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用layout.layout-large里面不同的

swift项目第七天:构建访客界面以及监听按钮点击

一:访客界面效果如图 二:代码 1:业务逻辑分析:1:由于用户未登录时要显示访客视图,要先进行判断用户是否登录,未登录则显示访客视图,登录则显示正常的登陆界面,由于要在四个子控制器界面的控制器中都要判断是否显示访客视图,同样的逻辑,所以考虑抽成父类,把判断是否显示访客视图的逻辑封装在父类中,让子类去继承.2:访客视图的界面如图:将访客视图封装在一个view中,view的界面相对固定,所以用xib搭建,首先将尽可能显示的控件全部封装在view的内部,再根据外界传入的model或是在封装类中定义方法

在DevExpress程序中使用内置的图标构建美观的界面元素

在我们一般的程序中,为一般的界面元素添加一定的图标展示,有助于提升界面的整体的美观.结合排版布局,以及固定场景的图标,往往给用户非常好的直观感受:统一.美观.易理解.因此在一般的程序界面中,都尽量在略显单调的界面增加一些图标进行点缀,能够达到较好的整体效果.本文介绍在Winform程序界面中,可以使用自己的图标库,也可以引入DevExpress程序中使用内置的图标,从而实现给开发的程序润色. 1.使用自己的图标库 不管在Web还是在WInform项目里面,开发者积累一定的图标库,包括256,12

基于angular2x+ng-bootstrap构建后台管理系统界面

写在前面的话 近来公司要做一个后台管理系统,人手比较少,于是作为一个前端也参与进来,其实据我所知,大部分的公司还是后台自己捣鼓的. 在后台没有到位的情况下,前端应该使用什么技术也着实让我为难了一把.经过短暂的调研,刷各种论坛,决定使用angular2x+bootstrap的方式去搭建后台管理系统. 用了大概一周,出于种种原因这方案被毙掉了,于是索性就写个小demo(将持续完善) 目录 预览 环境配置 依赖于 项目结构介绍 项目搭建步骤 最后 预览 项目预览    进入 项目源码 环境配置 需要安

qt利用QT designer构建第一个界面helloworld工程

第一步:点击New Project   第二步:选择Qt Widgets 第三步:项目名称和保存路径   第四步:一直点击下一步   第五步:点击编译执行就能出现第界面框了. 选择widget应用,就会出现下面的“界面文件”,通过他可以快速地建立按钮,滚动条等等. 这个界面是什么都没有的 第六步:双击红框处,会出现界面设计(这就是QT designer)   第七步:拖动一个 Push Button到框中,再拖动一个label到框中 这两样东西在左边栏找    找 这时候把 label(就是那个

Maven构建灵活配置文件

本文解决以下问题: Maven下面启动Main函数: 配置JDK版本 如何配置文件,在开发部署测试各个不同版本间无缝切换配置文件: 启动Main函数 Maven默认是不支持Main函数程序,需要在pom文件中添加如下插件(plugin)才可以. ????<build> ????????<plugins> ????????????<plugin> ????????????????<groupId>org.apache.maven.plugins</gro