您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > Android使用Fragment创建动态UI
使用Fragment创建动态UI使用Fragment创建动态UI在Android中创建动态、多栏的UI,你需要将UI组件和Activity行为封装到模块中,以便在Activity中交换。你可以使用Fragment类创建这些模块,这种行为有点像一个可以自己定义布局和管理生命周期的嵌套Activity。当一个Fragment指定它自身的布局时,它能和Activity内的其它Fragment配置成不同的组合以便为不同的屏幕大小修改你的布局结构(小屏幕一次可能只显示一个Fragment,大屏幕则可以显示两个或更多)。本课程展示了如何使用Fragment创建动态的用户体验以及为不同屏幕大小的设备优化App的用户体验,同时继续支持运行于低至Android1.6版本的设备。创建Fragment你可以认为Fragment是Activity的一个模块化部分,它有自己的生命周期,有自己的输入事件,并且你还可以在Activity运行时添加或移除它(有点像可以在不同的Activity中重用的“子Activity”)。这节内容展示了如何使用支持库继承Fragment,使你的App可以和运行低至Android1.6的设备保持兼容。注意:如果你决定了App要求的最小API级别为11以上,你可以使用框架内建的Fragment类及相关的API,而不需要使用支持库。只要知道这节课的重点在于使用支持库API,它使用特定的包签名,并且某些API名称和平台包含的版本有点不同。在你开始课程之前,你必须设置你的Android项目使用支持库。如果你之前没有使用支持库,按“安装支持库”文档所说的把你的项目设为使用v4库,你也可以使用v7appcompat库以便在Activity中包含操作栏,v7兼容Android2.1(API级别7)并且也包含FragmentAPI。创建Fragment类要创建Fragment,从Fragment类继承,重写关键的生命周期方法以插入App的应用逻辑,就像你在Activity类做的一样。不同的是,创建Fragment时,你必须在onCreateView()回调方法中定义布局。事实上,这是运行Fragment所需要的唯一回调方法。下例是一个指定自己布局的简单Fragment:importandroid.os.Bundle;importandroid.support.v4.app.Fragment;importandroid.view.LayoutInflater;importandroid.view.ViewGroup;publicclassArticleFragmentextendsFragment{@OverridepublicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,BundlesavedInstanceState){//填充fragment的布局returninflater.inflate(R.layout.article_view,container,false);}}就像Activity一样,Fragment应该实现其它的生命周期回调方法,这样,当它在Activity中被添加或移除时,以及Activity本身在生命周期状态中切换时,允许你管理Fragment的状态。例如,Activity的onPause()被调用时,Activity中的所有Fragment也会收到onPause()的调用。更多有关Fragment生命周期和回调方法的信息,请参考Fragment开发者指南。使用XML向Activity添加FragmentFragment是可重用的、模块化的UI组件,每个Fragment类的实例都必须关联一个父FragmentActivity。你可以在Activityr的布局XML文件中定义每一个Fragment来获取这种关联。注意:FragmentActivityj是一个支持库提供的特殊的Activity,用来在低于API级别11的系统版本中处理Fragment。如果你支持的最低系统版本高于API级别11,你可以使用Activity。这里是一个当设备屏幕为“大”(目录名使用了“large”修饰符)时,向Activity添加两个Fragment的布局文件的示例:res/layout-large/news_articles.xmlLinearLayoutxmlns:android=:orientation=horizontalandroid:layout_width=fill_parentandroid:layout_height=fill_parentfragmentandroid:name=com.example.android.fragments.HeadlinesFragmentandroid:id=@+id/headlines_fragmentandroid:layout_weight=1android:layout_width=0dpandroid:layout_height=match_parent/fragmentandroid:name=com.example.android.fragments.ArticleFragmentandroid:id=@+id/article_fragmentandroid:layout_weight=2android:layout_width=0dpandroid:layout_height=match_parent//LinearLayout提示:更多有关为不同屏幕大小创建布局的内容,参看“支持不同屏幕大小”。在Activity中应用布局:importandroid.os.Bundle;importandroid.support.v4.app.FragmentActivity;publicclassMainActivityextendsFragmentActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);}}如果你使用了v7appcompat库,Activity应该继承ActionBarActivity,这是FragmentActivity的一个子类(更多信息请参见“添加操作栏”)。注意:当你通过在布局XML文件中的声明Fragment的方式向Activity布局添加Fragment时,你不能在运行时移除Fragment。如果你打算在用户交互时交换Fragment,你必须在Activity首次启动时添加Fragment,这将在下一节演示。构建灵活的UI当为较大范围的屏幕尺寸设计应用程序时,你可以基于屏幕所允许的空间,在不同的布局配置中重用Fragment以优化用户体验。例如,在手机设备上为单面板用户界面一次只显示一个Fragment,相反,在有较宽屏幕尺寸的平板上可以并排设置Fragment来为用户显示更多信息。FragmentManager类提供方法允许你在运行时为Activity添加、移除以及替换Fragment,从而创建动态用户体验。在运行时向Activity添加Fragment相比在布局文件中为Activity定义Fragment——就象上节课中演示的使用fragment元素——你可以在Activity运行时添加Fragment,如果你打算在Activity生存期内改变Fragment,你必须这样做。要执行添加或移除Fragment的事务,你必须使用FragmentManager创建一个FragTransaction,它提供了添加、移除、替换及执行其它Fragment事务的API。如果你的Activity允许移除或替换Fragment,你应该在onCreate()方法中添加初始化Fragment的代码。在处理Fragment(尤其是那些运行时添加的)时有一个重要的规则,在布局中必须有一个容器视图供这些Fragment布局驻留。下面的布局是一个替换在上节内容中出现的一次只显示一个Fragment的布局。为了用一个Fragment替换另一个,Activity包含一个FrameLayout做为Fragment的容器。两个Fragment,用不同配置显示在不同屏幕尺寸上的同一个Activity中。在大屏幕上,两个Fragment并排显示,而在手机设备上,一次只显示一个Fragment,必须在用户导航时用一个Fragment替换另一个。注意文件名和上节内容中的布局文件名相同,但是目录名中没有“large”修饰符,因此这个布局用于设备屏幕比“large”小,不能同时填充两个Fragment的情况中。res/layout/news_articles.xmlFrameLayoutxmlns:android=:id=@+id/fragment_containerandroid:layout_width=match_parentandroid:layout_height=match_parent/在Activity中插入代码,调用支持库API的getSupportFragmentManager()方法获得FragmentManager,然后调用beginTransaction()创建FragmentTransaction,调用add()方法添加Fragment。你可以使用同一个FragmentTransaction执行多个Fragment事务,当你准备好要改变时,你必须调用commit()方法。下面是如何向Activity中添加Fragment的例子:importandroid.os.Bundle;importandroid.support.v4.app.FragmentActivity;publicclassMainActivityextendsFragmentActivity{@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.news_articles);//检查Activity正在使用的包含Fragment容器FrameLayout的布局版本if(findViewById(R.id.fragment_container)!=null){//如果我们是从较早的状态中恢复//我们不需要做任何事情,直接返回//否则,我们可能会覆盖掉已经存在的Fragmentif(savedInstanceState!=null){return;}//创建放在Activity中的新FragmentHeadlinesFragmentfirstFragment=newHeadlinesFragment();//在这个例子中,Activity是被Intent对象的特殊指令启动的,//把Intent的extras集合传递给Fragment做为参数firstFragment.setArguments(getIntent().getExtras());//把Fragment添加到容器FrameLayout中getSupportFragmentManager().beginTransaction().add(R.id.fragment_container,firstFragment).commit();}}}因为Fragment在运行时添加到FrameLayout容器中(替换在Activity布局文件中用fragment元素定义的)
本文标题:Android使用Fragment创建动态UI
链接地址:https://www.777doc.com/doc-2897219 .html