Android Fragments UI 碎片处理Word文档下载推荐.docx
- 文档编号:6805686
- 上传时间:2023-05-07
- 格式:DOCX
- 页数:14
- 大小:98.73KB
Android Fragments UI 碎片处理Word文档下载推荐.docx
《Android Fragments UI 碎片处理Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Android Fragments UI 碎片处理Word文档下载推荐.docx(14页珍藏版)》请在冰点文库上搜索。
Fragment在你的应用程序里是一个可独立且可复用的模块组件。
那是因为Fragment有其自己独立的布局及自己的生命周期回调行为,你可以在多个Activity中重复使用同一个Fragment。
特别要提到的是,Fragment允许你去适应和匹配不同客户端的屏幕大小。
例如,在客户端屏幕足够大时,你可以在一个Activity中包含多个Fragment展现,但如果不是,那么使用独立的Activity去包含不同的Fragment;
如何创建一个Fragment
创建一个Fragment,你必须有一个继承自Fragment类的对象,编码其实类似Activity的代码,也包含了onCreate(),onStart(),onPause(),和onStop()。
实际上,你很容就可以将你现有的Android应用程序转化为使用Fragment的应用。
只需将回调函数的代码移过来即可。
通常,你应该实现以下几个生命周期函数:
onCreate()
系统通过这个方法去创建Fragment。
使用你的实现方法,在这个方法里初始化主要的Fragement部件,这样你就可以暂停或者停止状态下对Fragment进行恢复了。
onCreateView()
系统在Fragment第一次绘制用户界面的时候调用。
你必须从这个方法里返回一个Fragment的总布局View,这样你才可以在View上进行Fragment绘制。
如果你不想绘制Fragment的UI,那么就可以返回null.
onPause()
系统在用户正要离开Fragment时调用(但不总是处于正销毁中).在用户会话结束后,通常会在这里会持久化数据(因为用户一般不会再回来)。
在你的应用里,至少实现这三个方法。
但是还有一些其他的回调方法可以实现,以便处理Fragment的其他生命周期。
以下是一些可以用来替代继承Fragment基类的子类:
DialogFragment
实现一个对话框用户界面,相对于使用Activity对象的一些帮组方法来弹出对话框,这种方式更优秀。
因为你可以把Fragment放到Activity的backstack中管理,允许用户再回到一个消失的Fragmnet。
ListFragment
列表展现适配器,类似ListActivity对象。
它提供了一些管理list的方法,比如onListItemClick可以获取点击事件句柄。
PreferenceFragment
类似PreferenceActivity,在创建一个系统设置的Activity时,非常有用。
如何增加一个Fragment用户界面
Fragment一般作为Activity用户界面的一部分,并且贡献它自己的布局给Activity。
在提供一个Fragment之前,你必须实现系统的onCreateView()回调函数,这个回调函数将Fragment绘制到布局当中。
你的实现方法必须返回一个View作为Fragment的基础视图布局。
注:
如果你的类继承自ListFragment,那么onCreateVIew方法默认会返回一个ListView对象,因此你可以不用去实现了。
为了从onCreateView方法返回一个布局对象,你可以在XML资源配置文件中定义。
为了实现这个目的,onCreateView方法提供了一个LayoutInflater对象。
publicstaticclassExampleFragmentextendsFragment{
@Override
publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer,
BundlesavedInstanceState){
//Inflatethelayoutforthisfragment
returninflater.inflate(R.layout.example_fragment,container,false);
}
}
container参数,是父类ViewGroup对象,表明你的Fragment要插入到的布局。
savedInstanceState对象是一个Bundle对象,用以保存前一个实例对象的状态,以便Fragmnt恢复时,恢复数据。
Inflate方法的三个参数:
1、
在XML资源配置中定义的Fragment的属性ID;
2、
Container指定fragment绘制的父视图布局;
3、
False表示系统已经将其插入到了container中,不许要在冗余的床建一个ViewGroup。
如何在Activity中新增一个Fragment
两种方法可以实现在Activity中新增一个Fragment:
在布局文件中去定义
<
?
xmlversion="
1.0"
encoding="
utf-8"
>
LinearLayoutxmlns:
android="
android:
orientation="
horizontal"
layout_width="
match_parent"
layout_height="
fragmentandroid:
name="
com.example.news.ArticleListFragment"
id="
@+id/list"
layout_weight="
1"
0dp"
/>
com.example.news.ArticleReaderFragment"
@+id/viewer"
2"
/LinearLayout>
在现成的ViewGroup对象中去编码实现
在Activity任何运行状态下,你都可以新增fragment到布局当中,你需要指定一个fragment放置的ViewGroup对象。
在Activity当中使用fragment事务,你必须使用FragmentTranscation的API,你可以在你的Activity当中这样去获取FragmentTranscation实例:
FragmentManagerfragmentManager=getFragmentManager()
FragmentTransactionft=fragmentManager.beginTransaction();
然后,你就可以使用add方法,指定fragment加入到视图当中了。
例如:
ExampleFragmentfragment=newExampleFragment();
fragmentTransaction.add(R.id.fragment_container,fragment);
fragmentTmit();
Add方法的第一个参数为指定一个ViewGroup对象的配置ID,第二参数为你要添加进去的fragment。
必须调用commit方法使其生效。
如何增加一个后台运行的Fragment
有些时候,我们并不需要Fragment在UI展现出来,只需要其在后台运行即可。
使用add(Fragment,String)方法增加一个后台运行的Fragment,String为唯一标识这个Fragment的Id,由于没有关联到任何的Activity布局,所有不能从onCreateView方法得到一个返回,因此需要自己去实现onCreateView方法。
使用findFragmentByTag()方法,可以查到你新增的fragment。
从而再次使用它。
一个没有UI的Fragment后台任务例子:
packagecom.example.android.apis.app;
importcom.example.android.apis.R;
importandroid.app.Activity;
importandroid.app.Fragment;
importandroid.app.FragmentManager;
importandroid.os.Bundle;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importandroid.view.View.OnClickListener;
importandroid.widget.Button;
importandroid.widget.ProgressBar;
/**
*ThisexampleshowshowyoucanuseaFragmenttoeasilypropagatestate
*(suchasthreads)acrossactivityinstanceswhenanactivityneedstobe
*restarteddueto,forexample,aconfigurationchange.Thisisalot
*easierthanusingtherawActivity.onRetainNonConfiguratinInstance()API.
*/
publicclassFragmentRetainInstanceextendsActivity{
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
//Firsttimeinit,createtheUI.
if(savedInstanceState==null){
getFragmentManager().beginTransaction().add(android.R.id.content,
newUiFragment()).commit();
/**
*ThisisafragmentshowingUIthatwillbeupdatedfromworkdone
*intheretainedfragment.
publicstaticclassUiFragmentextendsFragment{
RetainedFragmentmWorkFragment;
BundlesavedInstanceState){
Viewv=inflater.inflate(R.layout.fragment_retain_instance,container,false);
//Watchforbuttonclicks.
Buttonbutton=(Button)v.findViewById(R.id.restart);
button.setOnClickListener(newOnClickListener(){
publicvoidonClick(Viewv){
mWorkFragment.restart();
});
returnv;
publicvoidonActivityCreated(BundlesavedInstanceState){
super.onActivityCreated(savedInstanceState);
FragmentManagerfm=getFragmentManager();
//Checktoseeifwehaveretainedtheworkerfragment.
mWorkFragment=(RetainedFragment)fm.findFragmentByTag("
work"
);
//Ifnotretained(orfirsttimerunning),weneedtocreateit.
if(mWorkFragment==null){
mWorkFragment=newRetainedFragment();
//Tellitwhoitisworkingwith.
mWorkFragment.setTargetFragment(this,0);
fm.beginTransaction().add(mWorkFragment,"
).commit();
*ThisistheFragmentimplementationthatwillberetainedacross
*activityinstances.Itrepresentssomeongoingwork,hereathread
*wehavethatsitsaroundincrementingaprogressindicator.
publicstaticclassRetainedFragmentextendsFragment{
ProgressBarmProgressBar;
intmPosition;
booleanmReady=false;
booleanmQuiting=false;
*Thisisthethreadthatwilldoourwork.Itsitsinalooprunning
*theprogressupuntilithasreachedthetop,thenstopsandwaits.
finalThreadmThread=newThread(){
publicvoidrun(){
//We'
llfiguretherealvalueoutlater.
intmax=10000;
//Thisthreadrunsalmostforever.
while(true){
//UpdateoursharedstatewiththeUI.
synchronized(this){
//OurthreadisstoppediftheUIisnotready
//orithascompleteditswork.
while(!
mReady||mPosition>
=max){
if(mQuiting){
return;
try{
wait();
}catch(InterruptedExceptione){
//Nowupdatetheprogress.Noteitisimportantthat
//wetouchtheprogressbarwiththelockheld,soit
//doesn'
tdisappearonus.
mPosition++;
max=mProgressBar.getMax();
mProgressBar.setProgress(mPosition);
//Normallywewouldbedoingsomework,butputakludge
//heretopretendlikeweare.
wait(50);
};
*Fragmentinitialization.Wewaywewanttoberetainedand
*startourthread.
publicvoidonCreate(BundlesavedInstanceState){
//Telltheframeworktotrytokeepthisfragmentaround
//duringaconfigurationchange.
setRetainInstance(true);
//Startuptheworkerthread.
mThread.start();
*ThisiscalledwhentheFragment'
sActivityisreadytogo,after
*itscontentviewhasbeeninstalled;
itiscalledbothafter
*theinitialfragmentcreationandafterthefragmentisre-attached
*toanewactivity.
//Retrievetheprogressbarfromthetarget'
sviewhierarchy.
mProgressBar=(ProgressBar)getTargetFragment().getView().findViewById(
R.id.progress_horizontal);
//Wearereadyforourthreadtogo.
synchronized(mThread){
mReady=true;
mThread.notify();
*Thisiscalledwhenthefragmentisgoingaway.ItisNOTcalled
*whenthefragmentisbeingpropagatedbetweenactivityinstances.
publicvoidonDestroy(){
//Makethethreadgoaway.
mReady=false;
mQuiting=true;
super.onDestroy();
*Thisiscalledrightbeforethefragmentisdetachedfromits
*curr
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Fragments UI 碎片处理 碎片 处理