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


当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏、7寸屏、10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用layout、layout-large里面不同的布局文件实现的,下面是翻译的developer.android.com一篇的文章,里面的例子能详细的看出layout、layout-large并使用Fragmen构建灵活的桌面。

当设计应用程序,你可以在不同的布局结构中重复使用Fragment,以支持众多的屏幕尺寸,,在可用的屏幕空间上优化用户体验。例如在手持设备(如Nexus 4)上,一个屏显示一个Fragment,在更大屏(如Nexus 7)上可以使用多个Fragment显示信息。如下图:


图一

图一中,在大屏中两个Fragment显示在一个屏中,但是手持设备中,需要两屏显示完,一屏只能显示一个,他们之间需要相互引导。

FragmentManager类提供了一些方法,使您可以在Activity运行时添加,删除和替换Fragment,以创造一个灵活、动态的体验。

添加Fragment到一个运行的Activity

这里不是如同

Android UI开发第十七篇——Android Fragment实例》中将<fragment>标签放到布局文件。而是使用FragmentManager动态的管理Fragment。FragmentManager创建一个FragmentTransaction,

它提供了添加,删除以及其他fragment事务的API。activity允许移除或者替换fragment需要有如下条件:

1、activity的onCreate()方法中添加初始化的fragment

2、fragment放置位置的布局中必须有一个视图容器

程序例子中,res/layout/news_articles.xml文件提供了视图容器。

[html] view plain copy print ?
  1. <FrameLayoutxmlns:android="http://schemas.android.com/apk/res/android"
  2. android:id="@+id/fragment_container"
  3. android:layout_width="match_parent"
  4. android:layout_height="match_parent"/>

Activity中使用 getSupportFragmentManager()获取FragmentManager,之后调用beginTransaction去创建一个FragmentTransaction对象, 再调用add()方法即可添加一个fragment。在activity中可以使用同一个FragmentTransaction对象去执行多个fragment事务,当做这样操作时,必须调用commint()方法。 下面的代码演示怎样添加一个fragment到res/layout/news_articles.xml的layout:

[java] view plain copy print ?
  1. importandroid.os.Bundle;
  2. importandroid.support.v4.app.FragmentActivity;
  3. publicclassMainActivityextendsFragmentActivity{
  4. @Override
  5. publicvoidonCreate(BundlesavedInstanceState){
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.news_articles);
  8. //Checkthattheactivityisusingthelayoutversionwith
  9. //thefragment_containerFrameLayout
  10. if(findViewById(R.id.fragment_container)!=null){
  11. //However,ifwe'rebeingrestoredfromapreviousstate,
  12. //thenwedon'tneedtodoanythingandshouldreturnorelse
  13. //wecouldendupwithoverlappingfragments.
  14. if(savedInstanceState!=null){
  15. return;
  16. }
  17. //CreateaninstanceofExampleFragment
  18. HeadlinesFragmentfirstFragment=newHeadlinesFragment();
  19. //IncasethisactivitywasstartedwithspecialinstructionsfromanIntent,
  20. //passtheIntent'sextrastothefragmentasarguments
  21. firstFragment.setArguments(getIntent().getExtras());
  22. //Addthefragmenttothe'fragment_container'FrameLayout
  23. getSupportFragmentManager().beginTransaction()
  24. .add(R.id.fragment_container,firstFragment).commit();
  25. }
  26. }
  27. }

这里的fragment是在运行时添加到FrameLayout,而不是直接使用<fragment>标签定义在activity的布局中,activity可以移除它或者使用另外一个不同的fragment替换它。


替换Fragment

替换一个fragment的过程和添加Fragment的过程差不多,但是需要的是replace()方法,而不是add()方法。 需要注意的是,当执行fragment事务时,比如替换或者删除一个fragment,如果想能回退到当前,你必须在你提交fragment事务之前调用 addToBackStack()方法。

当移除或替换fragment时将事务添加到堆栈中,被移除的Fragmeng没有消亡,如果用户返回,Fragment会重新启动。如果没有放入到堆栈中,当Fragment被替换或移除,Fragment会消亡。

下面是替换Fragment的例子:

[java] view plain copy print ?
  1. //Createfragmentandgiveitanargumentspecifyingthearticleitshouldshow
  2. ArticleFragmentnewFragment=newArticleFragment();
  3. Bundleargs=newBundle();
  4. args.putInt(ArticleFragment.ARG_POSITION,position);
  5. newFragment.setArguments(args);
  6. FragmentTransactiontransaction=getSupportFragmentManager().beginTransaction();
  7. //Replacewhateverisinthefragment_containerviewwiththisfragment,
  8. //andaddthetransactiontothebackstacksotheusercannavigateback
  9. transaction.replace(R.id.fragment_container,newFragment);
  10. transaction.addToBackStack(null);
  11. //Committhetransaction
  12. transaction.commit();

addToBackStack()方法有一个可选的字符串参数,用来指定事务的唯一名称,这个是非必须的。


参考:http://developer.android.com/training/basics/fragments/fragment-ui.html


图二 Google IO APP


转载:http://blog.csdn.net/xyz_lmn/article/details/8638171

更多相关文章

  1. 【OSC手机App技术解析】- 集成新浪微博Android(安卓)SDK
  2. [置顶] 去掉listview的分割线和分割线的颜色,高度的设置
  3. 详解Android(安卓)Activity之间跳转出现短暂黑屏的处理方法
  4. 理解Android系统的进程间通信原理----RPC机制
  5. Android(安卓)激活Deviceadmin,并进行锁屏和恢复出厂设置
  6. AppInterface,一套Android与H5的混合开发框架
  7. Android连接、断开蓝牙扫描枪时屏幕刷新
  8. Android(安卓)SQLite学习
  9. Android(安卓)AsyncTask使用以及源码解析

随机推荐

  1. Android-Activity的四状态、七生命周期、
  2. [Android实例] Activity实例StartActivit
  3. Android(安卓)View事件派发机制详解与源
  4. Android之SurfaceHolder
  5. android 异步加载
  6. Android实现掷骰子效果
  7. Android(安卓)开发所有权限解析
  8. Android(安卓)动态申请权限
  9. ubuntu9.10下的android源码下载及编译
  10. Android系列学习:JSON解析