创建灵活的用户界面

简介:

这一节的主要内容

1、在运行时添加一个fragment到Activity

2、替换fragment

 

为了适应不同大小的屏幕,我们可以根据屏幕的大小动态地在不同的布局文件中重用fragment。比如,对于在手机上,我们可能就只能显示一个fragment,而在平板电脑上我们就可以并列地在界面上显示两个fragment,以便显示更多的信息。

图1.同一个Activity中的两个fragment在大小不同的屏幕上的显示效果。在大屏幕上,两个fragment并列显示。而在小屏幕上,同一时间只显示一个fragment,另一个fragment当用户需要的时候才显示。

在Activity运行时添加fragment

除了在XML配置文件中定义一个fragment--像上一节我们讲到的使用<fragment> 元素--你也可以在activity运行时向他添加一个fragment。如果你打算在activity存活的时候,改变fragment,这就很有必要。

为了实现事务性操作如添加或删除一个fragment,我们必须使用FragmentManager来创建一个FragmentTransaction。我们可以通过FragmentTransaction 提供的API实现添加、删除、替换和其他的fragment事务性操作。

如果你要允许activity中的fragment可以被删除或者替换,那你就应该在activity的onCreate() 方法中初始化fragment。

使用Fragment很重要的一点是--特别是当你想要在运行时添加fragment--就是fragment必须装在布局中的一个容器View里面.

下面的布局方式相对于上一节所讲的不能在运行时被修改的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()来获取兼容库(the Support Library)中的FragmentManager。然后调用beginTransaction() 来创建一个FragmentTransaction ,最后调用 add() 增加一个fragment.

你可以在一个Activity里面同时进行多个fragment事务性操作,使用同一个FragmentTransaction。当你已经没有更多要修改的东西时,你可以调用commit()让操作生效。

下面的例子展示的是怎么向前面的布局文件添加一个fragment:

复制代码
package com.bang.testfragment;

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,通常用户可能会想回退或者撤销原来的操作。为了允许用户撤销操作,你必须在准备提交FragmentTransaction前调用addToBackStack()

注意:当你删除或替换一个fragment并将添加fragment事务到back stack,被删除的其实是停止了(而不是销毁)。如果用户为了恢复fragment而回退,它就会重新启动。如果你没有将fragment事务添加到back stack中,那么当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中的任何东西
            // 并将事务添加到back stack 中,以便用户可以回退,恢复之前的操作
            transaction.replace(R.id.fragment_container, newFragment);
            transaction.addToBackStack(null);

            // 提交事务
            transaction.commit();
复制代码

addToBackStack() 方法接受一个用来做事务名称的string类型的参数。这个参数不是必须的,除非你打算使用用到FragmentManager.BackStackEntry APIs去做一些高级的fragment操作。

 

参考链接

本文转自陈哈哈博客园博客,原文链接http://www.cnblogs.com/kissazi2/p/3440256.html如需转载请自行联系原作者


kissazi2

相关文章
|
2月前
|
JSON 数据可视化 图形学
Graphix: 轻量级、可插拔、OOP 式图形编辑器开发引擎
A lightweight, pluggable, object-oriented programming (OOP) style graphic editor development engine / 一个轻量级、可插拔、OOP 式图形编辑器开发引擎
56 2
|
7月前
|
前端开发 JavaScript API
构建可重用用户界面:深入了解组件库的价值与实践
在现代应用程序开发中,组件库已经成为加速开发和提高代码质量的利器。它们是可重用的UI构建块,可以帮助开发者创建一致、漂亮和功能强大的用户界面。本博客将深入研究组件库的核心概念、最佳实践以及为什么它们对于现代开发至关重要。
32 0
|
11天前
|
编解码 监控 Android开发
安卓应用开发:构建高效用户界面的策略
【4月更文挑战第5天】在移动应用开发的世界中,一个流畅且直观的用户界面(UI)是吸引和保持用户的关键因素。本文将深入探讨如何在安卓平台上构建高效的用户界面,涵盖从布局优化、资源管理到性能监控的各个方面。我们的目标是为开发者提供实用的技术和策略,帮助他们创建快速、响应灵敏且美观的应用,从而在竞争激烈的市场中脱颖而出。
12 1
|
27天前
|
编解码 测试技术 Android开发
安卓应用开发:构建高效用户界面的实用指南
【2月更文挑战第29天】在移动应用开发的世界中,创建一个流畅、直观且响应迅速的用户界面(UI)对于吸引和保持用户至关重要。本篇文章旨在向安卓开发者展示如何通过优化布局设计、使用现代UI框架以及利用Android Studio提供的工具来构建高效的用户界面。我们将深入探讨如何减少内存消耗、提升渲染性能,并确保应用在不同设备和屏幕尺寸上的兼容性。跟随本文的指导,你将能够提高应用的整体用户体验,从而在竞争激烈的市场中脱颖而出。
|
4月前
|
设计模式
二十三种设计模式全面解析-桥接模式的高级应用:构建灵活的跨平台UI框架
二十三种设计模式全面解析-桥接模式的高级应用:构建灵活的跨平台UI框架
|
6月前
|
存储 API UED
关于 SAP UI5 扩展标准应用的两种方式
关于 SAP UI5 扩展标准应用的两种方式
37 1
|
8月前
|
JavaScript 小程序
UniApp 小程序封装原生组件(使用与交互详细流程)
UniApp 小程序封装原生组件(使用与交互详细流程)
232 0
|
JavaScript 前端开发 API
ReactJS 101:构建可重用组件、管理状态和创建实际应用程序的初学者指南
ReactJS 101:构建可重用组件、管理状态和创建实际应用程序的初学者指南
122 0
|
存储 IDE Java
快速开发Jmix 扩展组件
扩展组件的概念在使用 Jmix 框架开发中扮演着非常重要的角色。我们将在本文探索什么是扩展组件以及 Jmix Studio 在扩展组件开发和应用程序模块化方面能给开发者带来什么帮助。
168 0
快速开发Jmix 扩展组件
|
XML Android开发 数据格式
用户选项和设置用户界面
用户选项和设置用户界面
71 0