为了在Android上产生动态和多面板的用户界面,你需要将UI组件和activity行为封装成模块,你能将这些模块添加进或者移除你的Activity。你能产生这些模块用Fragment类。它的行为一定程度上像内嵌的activity,能定义它自己的布局和管理自己的生命周期。
当一个Fragment指定自己的布局时,它能和其他不同的fragment组合配置在一个activity里去修改你的布局配置去适应不同的屏幕尺寸(小屏幕一次可能显示一个fragment,但是大屏幕可能显示两个或者更多)。
本文讲述如何通过fragment产生一个动态的用户界面,以及不同的屏幕尺寸的设备上如何优化你的app的用户界面,所有的这些特性最低可以支持到Android 1.6.
Lessons
Create a Fragment
学习如何产生一个Fragment,以及如何在它的回调方法里实现基本的用户行为。
Building a Flexible UI
学习如何针对不同屏幕提供不同fragment配置的布局构建你的app。
Communicationg with Other Fragments
学习如何在Fragment与activity之前、以及Fragment与Fragment之前建立通信路径。
Creating a Fragment
你能把Fragment认为成activity的一个模块化部分,但它有自己的生命周期,接受它自己的输入事件,你也能在activity是running时添加或者移除它(简而言之,它像一个“子activity”,你能在不同的activity里复用它)。本文讲述了如何利用Support Library扩展和继承Fragment类。这样你的app仍然能兼容至android1.6的设备。
注:如果你确定你的app支持的最低API版本是11或者更高,你不需要使用Support Library,能直接使用SDK框架的Fragment和相关APIs。但本文主要讲如何基于Support Library使用这些APIs。这些APIs使用专门的package签名,有时稍稍和平台库里的版本名字上有些不同。
开始本课之前,你必须创建使用Support Library库的Android工程。之前如果你还没有使用Support Library,遵循Support Library Setup文档创建使用V4库包的工程。然而,你也能使用v7 appcompat包来代替使用v4包,这样,在你的Activity你同时也能使用action bar,v7最底兼容到android2.1(API level 7),也包括了Fragment APIs。
create a Fragment Class
为了产生一个Fragment,继承Fragment类,然后重写关键的生命周期方法,在这些关键生命周期方法里插入你的app的逻辑。类似于使用activity的方式。
产生Fragment的一个有所不同是你必须使用onCreateView()回调方法去定义布局。事实上,这是为了使你的Fragment运行你需要重写的唯一的回调方法,例如,这是一个指定了自己的布局的简单的fragment。
import android.os.Bundle;
import android.support.v4.app.Fragment; import android.view.LayoutInflater; import android.view.ViewGroup; public class ArticleFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // Inflate the layout for this fragment return inflater.inflate(R.layout.article_view, container, false); } }
像activity一样,fragment也应该实现其他的生命周期回调方法,这些方法能让fragment被添加或者移出activity时管理它的状态。例如,当activity的onPause()方法被调用时,在activity里的任何fragment的onPause()方法也将被调用。
更多的关于fragment生命周期和回调方法的信息可参见Fragments开发者向导。
Add a Fragment to an Activity using XML
当fragment是可重用的、模块化UI组件时,每个Fragment类的实例必须与一个FragmentActivity相关联。该类作为你的activity类的父类。你必须通过在你的activity布局文件里定义每个fragment来实现这种联系。
注:FragmentActivity是Support Library里为处理fragment向下兼容专门提供的一个类。如果你app支持的最低版本库是API 11,你可以直接使用Activity。
下面是一个加两个fragment到Activity的布局文件里的例子。该例子认为设备屏幕是“large”的(文件目录里专门指定了large标识符)。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent"> <fragment android:name="com.example.android.fragments.HeadlinesFragment" android:id="@+id/headlines_fragment" android:layout_weight="1" android:layout_width="0dp" android:layout_height="match_parent" /> <fragment android:name="com.example.android.fragments.ArticleFragment" android:id="@+id/article_fragment" android:layout_weight="2" android:layout_width="0dp" android:layout_height="match_parent" /> </LinearLayout>提示:更多的产生适应不同屏幕尺寸的布局,阅读Supporting Different Screen Sizes.
然后在你的activity里加载该布局:
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); } }如果你使用的v7 appcompat library,你的activity应该继承自ActionBarActivity,该类是FragmentActivity的子类(更多的信息,阅读Adding the Action Bar)。
注:当通过在布局文件里定义fragment加fragment到activity的布局时,你不能在运行时移除该fragment。如果你计划在和用户交换时从fragment里移入和移出发fragment,你必须在activity开始时添加fragment到activity,下面我们将会讨论。
Building a Flexible UI
当设计你的app支持多种屏幕尺寸时,你能复用你的fragment在不同的布局配置里以优化用户体验。
例如,一个手持设备对于单面板用户界面,一次可能只适合展示一个fragment。相反地,在一个平板设备上由于有更宽的屏幕空间可以展示更多的信息给用户,你可能想要展示多个fragment。
为了能产生动态的用户体验,FragmentManager类提供了在运行时动态向activity里添加、移除和替换fragment的方法。
Add a Fragment to an Activity at Runtime
比起在activity的布局文件里定义一个fragment——像上节显示的使用<fragment>元素——你能在actiivty运行时添加fragment到activity里。
为了添加或移除fragment时执行事务操作,你必须使用FragmentManager产生FragmentTransaction,用于在添加、移除或者替换fragment等操作时进行事务管理。
如果你的activity允许fragment被添加、移除或者替换,你应该在activity的onCreate()方法里添加初始化的fragment。
处理fragmen(特别那些在运行时添加的fragment)的一个重要原则是必须有一个能持有fragment布局的容器View。
上节中讲述的布局文件可以写成如下的形式,该布局一次仅显示一个fragment。为了用一个fragment替换另一个fragment,你的activity布局包含了一个空FrageLayout,该FrameLayout作为fragment
的容器。
注意该文件文件名和上节介绍的文件文件名相同,但布局文件目录并没有large标识符。因此该布局用于比大屏幕更小的设备,因为小屏幕不能一次适应两个fragment。
<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 APIs,调用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 { @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 a new Fragment to be placed in the activity layout 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(); } } }因为在运行时fragment已被添加到FrameLayout容器——而不是在activity的布局文件里使用<fragment>元素定义——activity能移除和用另一个fragment替换该fragment。
相关推荐
在Android开发中,Fragment是一种可以被嵌入到Activity中的模块化组件,它有自己的生命周期,并且可以接收自己的输入事件。在运行时,开发者可以添加或移除Fragment,就像使用子Activity一样,可以在不同的Activity...
《使用Android Fragments创建动态UI》第二版是一本专注于Android平台的开发书籍,详细介绍了如何利用Android的Fragment组件构建出适应不同设备特性的动态用户界面。书籍内容不仅涵盖了Fragment的基本概念和使用方法...
Create engaging apps with fragments to provide a rich user interface that dynamically adapts to the individual characteristics of your customers' tablets and smartphones About This Book From an ...
Long gone are the days of the mobile apps with a static UI squished onto a tiny screen. Today's users expect mobile apps to be dynamic and highly interactive. They expect an app to look fantastic when...
基于Android框架的动态UI构建(Creating Dynamic UI with Android Fragments, 2nd Edition)-2016英文原版,0积分——该书是2016年最新的第2版,全书154页。
Long gone are the days of mobile apps with a static UI squished on a tiny screen. Today's users expect mobile apps to be dynamic and highly interactive. They expect an app to look fantastic when they ...
标题中的“PyPI 官网下载 | Agora-Fragments-0.1.1.tar.gz”表明这是一个在Python Package Index(PyPI)上发布的开源软件包,名为Agora-Fragments,版本为0.1.1,其源代码被打包成了tar.gz格式。PyPI是Python开发者...
总之,"nested-fragments-master"项目提供了深入学习和实践嵌套Fragment的机会,包括如何在实践中有效地利用它们来构建复杂、模块化的Android UI,以及如何解决在使用过程中可能遇到的各种挑战。通过这个项目,...
[Packt Publishing] Creating Dynamic UI with Android Fragments E Book ☆ 图书概要:☆ Leverage the power of Android fragments to develop dynamic user interfaces for your apps Overview Learn ...
安装# NPMnpm install ui-fragments# Yarnyarn add ui-fragments成分该项目仍处于早期开发中。 新组件将在未来几个月内定期添加。 按钮路线图该项目的主要目标是构建实用工具React UI组件,可以轻松对其进行扩展,...
adp-worker-fragments, 使用 Fragments 处理配置更改 工作 Fragment这里示例代码随处理配置更改的博客文章一起随 Fragments 。这个存储库中的代码是开发人员要共享的Android的产品,并且它的所有内容都在,中。
来自 custom-animations-with-fragments 的想法和来自代码参考我在“编辑模式”中添加了单击侦听器,并在双击粘滞时处理错误物品 有关更多详细信息,请参阅。 学分 灵感来自的custom-animations-with-fragments 。
在`ember-data-model-fragments-master`这个压缩包中,我们通常会找到以下组件: 1. `app`目录:包含了ember应用的核心代码,如模型(model)、组件(component)、控制器(controller)和路由(route)等。 2. `tests`目录...
官方版本,亲测可用
官方版本,亲测可用
官方版本,亲测可用
Ajax-responsive-fragments.zip,使用html5数据属性和包含url的设备类别“keyword”(空)div-tags,让jquery(ajax)在css更改body时加载(追加)该url作为附加内容:在css3使用mediaquery生成内容值之后。...
这个项目名为"Material-Design-Tab-Layout-with-View-Pager-and-Fragments-Example",它展示了如何在Android应用中实现一个符合Material Design规范的选项卡布局,同时结合了View Pager和Fragments来实现动态内容...
3. Android UI:使用布局和视图组以及片段(Fragments) 布局是Android UI设计中用于定义组件空间关系的结构。学习不同类型的布局,例如LinearLayout、TableLayout、RelativeLayout、FrameLayout和GridLayout,以及...