Android官方开发教程中文版(五)_第1页
Android官方开发教程中文版(五)_第2页
Android官方开发教程中文版(五)_第3页
Android官方开发教程中文版(五)_第4页
Android官方开发教程中文版(五)_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、Android官方开发教程中文版使用Fragment创立动态UI使用Fragment创立动态UI在Android中创立动态、多栏的UI,你需要将UI组件和Activity行为封装到模块中,以便在Activity中交换。你可以使用Fragment类创立这些模块,这种行为有点像一个可以自己定义布局和管理生命周期的嵌套Activity。当一个Fragment指定它自身的布局时,它能和Activity内的其它Fragment配置成不同的组合以便为不同的屏幕大小修改你的布局结构小屏幕一次可能只显示一个Fragment,大屏幕那么可以显示两个或更多。本课程展示了如何使用Fragment创立动态的用户体验以

2、及为不同屏幕大小的设备优化App的用户体验,同时继续支持运行于低至Android1.6版本的设备。创立Fragment你可以认为Fragment是Activity的一个模块化局部,它有自己的生命周期,有自己的输入事件,并且你还可以在Activity运行时添加或移除它有点像可以在不同的Activity中重用的“子Activity。这节内容展示了如何使用支持库继承Fragment,使你的App可以和运行低至Android1.6的设备保持兼容。注意:如果你决定了App要求的最小API级别为11以上,你可以使用框架内建的Fragment类及相关的API,而不需要使用支持库。只要知道这节课的重点在于使用

3、支持库API,它使用特定的包签名,并且某些API名称和平台包含的版本有点不同。在你开始课程之前,你必须设置你的Android工程使用支持库。如果你之前没有使用支持库,按“安装支持库文档所说的把你的工程设为使用v4库,你也可以使用v7 appcompat库以便在Activity中包含操作栏,v7兼容Android2.1API级别7并且也包含Fragment API。创立Fragment类要创立Fragment,从Fragment类继承,重写关键的生命周期方法以插入App的应用逻辑,就像你在Activity类做的一样。不同的是,创立Fragment时,你必须在onCreateView()回调方法中

4、定义布局。事实上,这是运行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(LayoutInf

5、later inflater, ViewGroup container,        Bundle savedInstanceState)         / 填充fragment的布局        return inflater.inflate(R.layout.article_view, container, false);    就像Activity一样,Fragment应该实现其它的生命周期回调方法,这样,当它在Activity中被添加或移除时

6、,以及Activity本身在生命周期状态中切换时,允许你管理Fragment的状态。例如,Activity的onPause()被调用时,Activity中的所有Fragment也会收到onPause()的调用。更多有关Fragment生命周期和回调方法的信息,请参考Fragment开发者指南。使用XML向Activity添加FragmentFragment是可重用的、模块化的UI组件,每个Fragment类的实例都必须关联一个父FragmentActivity。你可以在Activityr的布局XML文件中定义每一个Fragment来获取这种关联。注意:FragmentActivityj 是一个

7、支持库提供的特殊的Activity,用来在低于API级别11的系统版本中处理Fragment。如果你支持的最低系统版本高于API级别11,你可以使用Activity。这里是一个当设备屏幕为“大目录名使用了“large修饰符时,向Activity添加两个Fragment的布局文件的例如:res/layout-large/news_articles.xml<LinearLayout xmlns:android=" :/schemas.android /apk/res/android"    android:orientation="horiz

8、ontal"    android:layout_width="fill_parent"    android:layout_height="fill_parent">    <fragment android:name="com.example.android.fragments.HeadlinesFragment"              android:id="+id

9、/headlines_fragment"              android:layout_weight="1"              android:layout_width="0dp"              android:layout_height="match_parent" /> 

10、;   <fragment android:name="com.example.android.fragments.ArticleFragment"              android:id="+id/article_fragment"              android:layout_weight="2"        

11、0;     android:layout_width="0dp"              android:layout_height="match_parent" /></LinearLayout>提示:更多有关为不同屏幕大小创立布局的内容,参看“支持不同屏幕大小。在Activity中应用布局:import android.os.Bundle;import android.support.v4.app.FragmentActivity;publ

12、ic class MainActivity extends FragmentActivity     Override    public void onCreate(Bundle savedInstanceState)         super.onCreate(savedInstanceState);        setContentView(R.layout.news_articles);    如果你使用了v7 appcompat库,Activ

13、ity应该继承ActionBarActivity,这是FragmentActivity的一个子类更多信息请参见“添加操作栏。注意:当你通过在布局XML文件中的声明Fragment的方式向Activity布局添加Fragment时,你不能在运行时移除Fragment。如果你打算在用户交互时交换Fragment,你必须在Activity首次启动时添加Fragment,这将在下一节演示。构建灵活的UI当为较大范围的屏幕尺寸设计应用程序时,你可以基于屏幕所允许的空间,在不同的布局配置中重用Fragment以优化用户体验。例如,在 设备上为单面板用户界面一次只显示一个Fragment,相反,在有较宽屏幕

14、尺寸的平板上可以并排设置Fragment来为用户显示更多信息。两个Fragment,用不同配置显示在不同屏幕尺寸上的同一个Activity中。在大屏幕上,两个Fragment并排显示,而在 设备上,一次只显示一个Fragment,必须在用户导航时用一个Fragment替换另一个。FragmentManager类提供方法允许你在运行时为Activity添加、移除以及替换Fragment,从而创立动态用户体验。在运行时向Activity添加Fragment相比在布局文件中为Activity定义Fragment就象上节课中演示的使用<fragment>元素你可以在Activity运行时添

15、加Fragment,如果你打算在Activity生存期内改变Fragment,你必须这样做。要执行添加或移除Fragment的事务,你必须使用FragmentManager创立一个FragTransaction,它提供了添加、移除、替换及执行其它Fragment事务的API。如果你的Activity允许移除或替换Fragment,你应该在onCreate()方法中添加初始化Fragment的代码。在处理Fragment尤其是那些运行时添加的时有一个重要的规那么,在布局中必须有一个容器视图供这些Fragment布局驻留。下面的布局是一个替换在上节内容中出现的一次只显示一个Fragment的布局。

16、为了用一个Fragment替换另一个,Activity包含一个FrameLayout做为Fragment的容器。注意文件名和上节内容中的布局文件名相同,但是目录名中没有“large修饰符,因此这个布局用于设备屏幕比“large小,不能同时填充两个Fragment的情况中。res/layout/news_articles.xml<FrameLayout xmlns:android=" :/schemas.android /apk/res/android"    android:id="+id/fragment_container"

17、    android:layout_width="match_parent"    android:layout_height="match_parent" />在Activity中插入代码,调用支持库API的getSupportFragmentManager()方法获得FragmentManager,然后调用beginTransaction()创立FragmentTransaction,调用add()方法添加Fragment。你可以使用同一个FragmentTransaction执行多个Fragment事

18、务,当你准备好要改变时,你必须调用commit()方法。下面是如何向Activity中添加Fragment的例子:import android.os.Bundle;import android.support.v4.app.FragmentActivity;public class MainActivity extends FragmentActivity     Override    public void onCreate(Bundle savedInstanceState)         super.on

19、Create(savedInstanceState);        setContentView(R.layout.news_articles);        / 检查Activity正在使用的包含Fragment容器FrameLayout的布局版本        if (findViewById(R.id.fragment_container) != null)             / 如果我们是从较早的状

20、态中恢复            / 我们不需要做任何事情,直接返回            / 否那么,我们可能会覆盖掉已经存在的Fragment            if (savedInstanceState != null)                 return;        

21、60;               / 创立放在Activity中的新Fragment             HeadlinesFragment firstFragment = new HeadlinesFragment();                        / 在这个例子中,Activity是被Intent对象的特殊指令启动的,&

22、#160;     / 把Intent的extras集合传递给Fragment做为参数            firstFragment.setArguments(getIntent().getExtras();                        / 把Fragment添加到容器FrameLayout中           

23、getSupportFragmentManager().beginTransaction()                    .add(R.id.fragment_container, firstFragment) mit();            因为Fragment在运行时添加到FrameLayout容器中替换在Activity布局文件中用<fragment>元素定义的,Activity可以移除它,并用另一个Fr

24、agment替换它。用一个Fragment替换另一个替换Fragment的过程就是简单的添加一个Fragment,只不过是用replace()方法代替add()方法。请记住,当执行Fragment事务,如替换或删除Fragment时,它通常允许用户向后导航并“撤销改变。要允许用户通过Fragment事务向后导航,你必须在提交FragmentTransaction之前调用addToBackStack()方法。注意:当你移除或替换一个Fragment并把事务添加到返回栈时,被移除的Fragment处于停止状态不是被销毁。如果用户向后导航以恢复Fragment,它会重新启动。如果你没有向返回栈中添加

25、事务,那么移除或替换Fragment时,它被销毁。下面是替换Fragment的例子:/ 创立一个Fragment并给它指定一个要显示的文章做为参数ArticleFragment newFragment = new ArticleFragment();Bundle args = new Bundle();args.putInt(ArticleFragment.ARG_POSITION, position);newFragment.setArguments(args);FragmentTransaction transaction = getSupportFragmentManager().beg

26、inTransaction();/ 用这个Fragment替换Fragment容器中的内容/ 向返回栈中添加事务以便用户可以向后导航transaction.replace(R.id.fragment_container, newFragment);transaction.addToBackStack(null);/ 提交事务transaction mit();addToBackStack()方法有一个可选参数来为事务指定唯一名称,不需要这个名称,除非你打算用FragmentManager.BackStackEntry API来执行Fragment的高级操作。和其它Fragment通信为了重用F

27、ragment UI组件,你应该定义一个完全独立的、模块化的组件,它定义了自己的布局和行为。一旦你定义了这些可重用的Fragment,你可以把它们和Activity结合起来,并关连应用程序逻辑以实现整体组合UI。通常你会希望一个Fragment能和其它Fragment通信,比方基于用户事件改变内容。所有Fragment到Fragment的通信都是通过相关的Activity,两个Fragment之间应该永远不要直接通信。定义接口要允许一个Fragment和它所在的Activity通信,你可以在Fragment类中定义一个接口,在Activity中实现它。Fragment会在onAttach()生

28、命周期回调方法中捕获接口的实现,并能调用接口方法和Activity通信。下面是Fragment和Activity通信的例子:public class HeadlinesFragment extends ListFragment     OnHeadlineSelectedListener mCallback;    / 容器Activity必须实现这个接口    public interface OnHeadlineSelectedListener         public void onA

29、rticleSelected(int position);        Override    public void onAttach(Activity activity)         super.onAttach(activity);                / 确保容器Activity实现了回调接口,         / 否那么,它会抛出异常  &#

30、160;     try             mCallback = (OnHeadlineSelectedListener) activity;        catch (ClassCastException e)             throw new ClassCastException(activity.toString()          

31、60;         + " must implement OnHeadlineSelectedListener");                    .现在Fragment可以使用OnHeadlineSelectedListener接口的实例mCallback调用onArticleSelected()方法把消息发送给Activity。例如,当用户点击列表项时,Fragment中的方法使用回调接品把事件发送到父Activity:

32、    Override    public void onListItemClick(ListView l, View v, int position, long id)         / 把事件发送到父Activity        mCallback.onArticleSelected(position);    实现接口为了从Fragment中接收事件回调,父Activity必须实现在Fragment类中定义的接口。下面是一个实现上例中接口的例子

33、:public static class MainActivity extends Activity        implements HeadlinesFragment.OnHeadlineSelectedListener    .        public void onArticleSelected(int position)         / 当用户选择了HeadlinesFragment的标题时,      

34、  / 完成显示文章的代码    发送消息到Fragment父Activity可以把消息发给通过findFragmentById()方法捕获的Fragment实例,然后直接调用Fragment的公开方法。例如,假设上面的Activity包含另一个Fragment,用来显示通过上面的回调方法获得的列表项数据。在该例中,Activity可以把在回调方法中收到的信息传递给另一个Fragment并显示它。public static class MainActivity extends Activity        implemen

35、ts HeadlinesFragment.OnHeadlineSelectedListener    .    public void onArticleSelected(int position)         / 当用户选择了HeadlinesFragment的标题时,         / 完成显示文章的代码        ArticleFragment articleFrag = (ArticleFragment)                getSupportFragmentManager().findFragmentById(R.id.article_fragment);        if (articleFrag != null)             / 如果显示文章的Fragment可用,我们处于双栏布局中.            / 调用ArticleFrag

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论