使用Fragment构建灵活的桌面

转载 2015年07月10日 17:05:44

  当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括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实例》中将标签放到布局文件。而是使用FragmentManager动态的管理Fragment。FragmentManager创建一个FragmentTransaction,

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

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


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


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


[html] view plaincopy
  1. <FrameLayout xmlns: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 plaincopy
  1. import android.os.Bundle;  
  2. import android.support.v4.app.FragmentActivity;  
  3.   
  4. public class MainActivity extends FragmentActivity {  
  5.     @Override  
  6.     public void onCreate(Bundle savedInstanceState) {  
  7.         super.onCreate(savedInstanceState);  
  8.         setContentView(R.layout.news_articles);  
  9.   
  10.         // Check that the activity is using the layout version with  
  11.         // the fragment_container FrameLayout  
  12.         if (findViewById(R.id.fragment_container) != null) {  
  13.   
  14.             // However, if we're being restored from a previous state,  
  15.             // then we don't need to do anything and should return or else  
  16.             // we could end up with overlapping fragments.  
  17.             if (savedInstanceState != null) {  
  18.                 return;  
  19.             }  
  20.   
  21.             // Create an instance of ExampleFragment  
  22.             HeadlinesFragment firstFragment = new HeadlinesFragment();  
  23.               
  24.             // In case this activity was started with special instructions from an Intent,  
  25.             // pass the Intent's extras to the fragment as arguments  
  26.             firstFragment.setArguments(getIntent().getExtras());  
  27.               
  28.             // Add the fragment to the 'fragment_container' FrameLayout  
  29.             getSupportFragmentManager().beginTransaction()  
  30.                     .add(R.id.fragment_container, firstFragment).commit();  
  31.         }  
  32.     }  
  33. }  

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


替换Fragment


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


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


       下面是替换Fragment的例子:


[java] view plaincopy
  1. // Create fragment and give it an argument specifying the article it should show  
  2. ArticleFragment newFragment = new ArticleFragment();  
  3. Bundle args = new Bundle();  
  4. args.putInt(ArticleFragment.ARG_POSITION, position);  
  5. newFragment.setArguments(args);  
  6.   
  7. FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();  
  8.   
  9. // Replace whatever is in the fragment_container view with this fragment,  
  10. // and add the transaction to the back stack so the user can navigate back  
  11. transaction.replace(R.id.fragment_container, newFragment);  
  12. transaction.addToBackStack(null);  
  13.   
  14. // Commit the transaction  
  15. transaction.commit();  
 

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


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

图二 Google IO APP


/**
* @author 张兴业
*  http://blog.csdn.net/xyz_lmn
* android开发进阶群:241395671
*/

相关文章推荐

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

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏、7寸屏、10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用la...

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

当我们设计应用程序时,希望能够尽最大限度的适配各种设备,包括4寸屏、7寸屏、 10寸屏等等,Android开发文档给了我们参考,而且Google IO的app(如图二)也实现了这种思想,他们都是使用l...

Fragment的概念与使用(二)--构建灵活的Android应用UI

Fragment的概念与使用(二)--构建灵活的Android应用UI 分类: Android开发2012-12-28 22:12 5408人阅读 评论(0) 收藏 举报 ...

Training--使用Fragment创建动态UI(2)--构建一个灵活的UI

使用Fragment创建动态UI(2)--构建一个灵活的UI   当你想把你的app设计成一个可以支持各种屏幕尺寸的时候,你可以根据屏幕上可用的空间,在不同的布局文件里复用fragment,优化用...

如何使用Fragment构建灵活的UI

如何使用Fragment构建灵活的UI如何使用Fragment构建灵活的UI Main 创建Fragment 自定义一个Fragment类 在XML文件中将一个Fragment绑定给Activity ...
  • wucsdn0
  • wucsdn0
  • 2017年02月23日 15:14
  • 256

Android fragment(片段)构建灵活的UI

在以支持多种屏幕尺寸为目标设计应用时,您可以在不同的布局配置中重复使用您的fragment从而根据可用的屏幕空间优化用户体验。例如,在手机设备上,由于采用单窗格用户界面,因此可能更适合一次只显示一个f...

构建灵活的UI之Fragment(二)

FragmentManager类允许你的在运行期间向你的Activity中增加,移除和替换Fragment来提供一种动态体验 在运行期间向你的Activity添加Fragment,相比于在布局文件中用...

Android开发————Fragment的灵活使用

Fragment是作为Activity的UI的一部分,它内嵌在Activity中,多个Fragment可以把一个Activity分成多个部分,这在大屏幕手机或者平板电脑中会比较多的用到,这样就不用使用...

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

当你设计你的应用来支持多个屏幕尺寸,你可以基于可用的屏幕空间通过在不同的布局上重用fragment来优化用户体验。...

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

构造灵活的 UI 上一课 下一课 这节课教你 在运行时添加 Fragment 到 Activity替换 Fragment 你还需要阅读 ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:使用Fragment构建灵活的桌面
举报原因:
原因补充:

(最多只允许输入30个字)