安卓训练-开始-使用 Fragment 构造动态 UI-构造灵活的 UI

构造灵活的 UI

上一课

下一课

这节课教你

  1. 在运行时添加 Fragment 到 Activity
  2. 替换 Fragment

你还需要阅读

试试

下载示例

FragmentBasics.zip

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

例如,在一个手持设备上,单栏用户界面中每次只显示一个 fragment 可能比较合适。相反地,在一个平板上,有更宽的屏幕尺寸展示更多的信息给用户,你可能并行地设置多个 fragment。

图 1. 两个 fragment,同一个 activity,在不同的屏幕尺寸上以不同的配置显示。在大屏幕上,两个 fragment 并行排列适合屏幕,但是在手持设备上,每次只有一个 fragment 适合,当用户导航时 fragment 必须相互替换。

FragmentManager 类提供了运行时添加 fragment 到 activity,从 activity 中删除 fragment,和在 activity 中替换 fragment的方法,使用这些方法你可以创建动态的用户体验。

在运行时添加 Fragment 到 Activity



不是在布局文件中为 activity 定义 fragment—像上一课所展示的使用<fragment> 元素—你可以在运行时添加 fragment 到 activity。这是必须的,如果你想在 activity
的生命周期中改变它的 fragment。

为了执行一个事务,比如添加或删除一个 fragment,你必须使用
FragmentManager
创建一个FragmentTransaction,它提供了添加,删除,替换和执行其他
fragment 事务的 API。

如果你的 activity 允许 fragment 被删除或替换,你应该在 activity 的
onCreate()
方法中添加初始 fragment 到 activity。

一条处理 fragment—特别是你运行时添加的 fragment—的重要规则是在包含 fragment 的布局的布局中 fragment 必须要有一个容器View

下面的布局是上一课中每次只显示一个 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 中,使用支持库 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 的附加数据作为参数传给 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 的过程与添加类似,但要用
replace()
方法而不是add()

记住,当你执行 fragment 事务,比如替换或删除一个 fragment,通常允许用户向后导航和"撤销"变化是恰当的。 为了允许用户在 fragment 事务中能向后导航,你必须在提交FragmentTransaction
前调用addToBackStack()

注意:当你删除或替换一个 fragment 并把事务添加到返回栈(back stack),删除的 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 替换 fragment_container 视图中的东西
// 并把事务添加到返回栈,让用户可以导航回来
transaction.replace(R.id.fragment_container, newFragment);
transaction.addToBackStack(null);

// 提交事务
transaction.commit();

addToBackStack() 方法接收一个可选的字符串参数,这个参数为事务指定一个唯一名称。这个名称并不需要,除非你计划使用FragmentManager.BackStackEntry
API 执行一些高级的 fragment 操作。

上一课下一课

时间: 2024-10-07 13:45:13

安卓训练-开始-使用 Fragment 构造动态 UI-构造灵活的 UI的相关文章

安卓训练-开始-使用 Fragment 构造动态 UI-创建 Fragment

创建 Fragment 上一课 下一课 这节课教你 创建一个 Fragment 类 使用 XML 添加 Fragment 到 Activity 你还需要阅读 Fragments 试试 下载示例 FragmentBasics.zip 你可以认为 fragment 是 activity 的模块化的部分,它有自己的生命周期,接收自己的输入事件,你可以在 activity 的运行过程中把它添加到 activity 或从 activity 中删除它(有点像一个你可以在不同 activity 中使用的"子

安卓训练-开始-使用 Fragment 构造动态 UI-与其他 Fragment 通信

与其他 Fragment 通信 上一课 下一课 这节课教你 定义接口 实现接口 发送消息到一个 Fragment 你还需要阅读 Fragments 试试 下载示例 FragmentBasics.zip 为了重用 Fragment UI 组件,你应该把每个 Fragment 构造成定义自己的布局和行为的完整的自包含的模块化的组件.一旦你定义了这些可重用的 Fragment,你可以把它们关联到一个 Activity 并使用应用逻辑连接它们实现整体的组合 UI. 通常你希望一个 Fragment 与其

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学习路线(二十)运用Fragment构建动态UI

要在Android系统上创建一个动态或者多面板的用户界面,你需要将UI组件以及activity行为封装成模块,让它能够在你的activity中灵活地切换显示与隐藏.你可以使用Fragment类来创建这些模块,它们能够表现得有些像嵌套的activity,它们定义着自己的布局,管理自己的生命周期. 当一个fragment指定了它自己的布局,它可以在activity中和其他的fragment配置为不同的组合,这样就能够为不同的屏幕尺寸来修改你的布局配置(在小屏幕上一次展现一个fragment,而在大屏

Android学习路线(二十一)运用Fragment构建动态UI——创建一个Fragment

你可以把fragment看成是activity的模块化部分,它拥有自己的生命周期,接受它自己的输入事件,你可以在activity运行时添加或者删除它(有点像是一个"子activity",你可以在不同的activity中重用它).本课将向你展示如何使用Support Libaray继承 Fragment 类来让你的应用能够兼容正在运行Android 1.6的设备. 提示: 如果你决定你的应用需求的最低API级别是11或者更高,那么你不需要使用Support Library,你可以直接使用

Android学习路线(二十二)运用Fragment构建动态UI——构建一个灵活的UI

先占个位置,下次翻译 :p When designing your application to support a wide range of screen sizes, you can reuse your fragments in different layout configurations to optimize the user experience based on the available screen space. For example, on a handset devi

Android学习路线(二十三)运用Fragment构建动态UI——Fragment间通讯

先占个位置,下次翻译 :p In order to reuse the Fragment UI components, you should build each as a completely self-contained, modular component that defines its own layout and behavior. Once you have defined these reusable Fragments, you can associate them with

9) 十分钟学会android--使用Fragment建立动态UI

为了在 Android 上为用户提供动态的.多窗口的交互体验,需要将 UI 组件和 Activity 操作封装成模块进行使用,这样我们就可以在 Activity 中对这些模块进行切入切出操作.可以用 Fragment 创建这些模块,Fragment 就像一个嵌套的 Activity,拥有自己的布局(Layout)并管理自己的生命周期. Fragment 定义了自己的布局后,它可以在 Activity 中与其他 Fragment 生成不同的组合,从而为不同的屏幕尺寸生成不同的布局(小屏幕一次也许只

安卓开发复习笔记——Fragment+FragmentTabHost组件(实现新浪微博底部菜单)

记得之前写过2篇关于底部菜单的实现,由于使用的是过时的TabHost类,虽然一样可以实现我们想要的效果,但作为学习,还是需要来了解下这个新引入类FragmentTabHost 之前2篇文章的链接: 安卓开发复习笔记——TabHost组件(一)(实现底部菜单导航) 安卓开发复习笔记——TabHost组件(二)(实现底部菜单导航) 关于Fragment类在之前的安卓开发复习笔记——Fragment+ViewPager组件(高仿微信界面)也介绍过,这里就不再重复阐述了. 国际惯例,先来张效果图: 下面