Android Fragment 深度解析+++.docx
- 文档编号:28132978
- 上传时间:2023-07-08
- 格式:DOCX
- 页数:16
- 大小:18.68KB
Android Fragment 深度解析+++.docx
《Android Fragment 深度解析+++.docx》由会员分享,可在线阅读,更多相关《Android Fragment 深度解析+++.docx(16页珍藏版)》请在冰豆网上搜索。
AndroidFragment深度解析+++
AndroidFragment深度解析
过一些面试经验的人基本都深有体会,每次面试一般都会问到Fragment的知识,所以,今天我就单独把Fragment拿出来与大家分享一下.
会涉及到Fragment如何产生,什么是Fragment,Fragment生命周期,如何静态和动态使用Fragment,Fragment回退栈,Fragment事务,以及Fragment的一些特殊用途,例如:
没有布局的Fragment有何用处?
Fragment如何与Activiy交互?
Fragment如何创建对话框?
Fragment如何与ActionBar集成等等...
1、Fragment的产生与介绍
Android运行在各种各样的设备中,有小屏幕的手机,超大屏的平板甚至电视。
针对屏幕尺寸的差距,很多情况下,都是先针对手机开发一套app,然后拷贝一份,修改布局以适应什么超级大屏的。
难道无法做到一个app可以同时适应手机和平板吗?
答案是,当然有,那就是Fragment.Fragment出现的初衷就是为了解决这样的问题。
你可以把Fragment当成Activity一个界面的一部分,甚至Activity的界面由完全不同的Fragment组成,更帅气的是Fragment有自己的声明周期和接收、处理用户的事件,这样就不必要在一个Activity里面写一堆事件、控件的代码了。
更为重要的是,你可以动态的添加、替换、移除某个Fragment。
2、Fragment的生命周期
Fragment必须是依存于Activity而存在的,因此Activity的生命周期会直接影响到Fragment的生命周期。
官网这张图很好的说明了俩者的关系:
可以看到Fragment比Activity多了几个额外的生命周期回调函数:
onAttach(Activity); //当Activity与Fragment发生关联时调用
onCreateView(LayoutInflater,ViewGroup,Bundle); //创建该Fragment的视图
onActivityCreate(bundle); //当Activity的onCreate();方法返回时调用
onDestoryView(); //与onCreateView相对应,当改Fragment被移除时调用
onDetach(); //与onAttach()相对应,当Fragment与Activity的关联被取消时调用
注意:
除了onCreateView,其他的所有方法如果你重写了,必须调用父类对于该方法的实现。
3、静态的使用Fragment
接下来,就是实践的时候了,要注意了,开始写代码喽~~~~
这是使用Fragment最简单的一种方式,把Fragment当成普通的控件,直接写在Activity的布局文件中,用布局文件调用Fragment。
步骤:
1、继承Fragment,重写onCreateView决定Fragment布局。
2、在Activity中声明此Fragment,就当和普通的View一样。
下面展示一个例子(我使用俩个Fragment作为Activity的布局,一个Fragment用于标题布局,一个Fragment用于内容布局)。
TitleFragment的布局文件,在这里我们可以看出,我们可以每个Fragment当中进行单独的布局:
复制代码
xmlversion="1.0"encoding="utf-8"?
>
android=" android: layout_width="fill_parent" android: layout_height="45dp" android: background="@drawable/title_bar"> android: id="@+id/id_title_left_btn" android: layout_width="wrap_content" android: layout_height="fill_parent" android: layout_centerVertical="true" android: background="@drawable/showleft_selector"/> android: layout_width="fill_parent" android: layout_height="fill_parent" android: gravity="center" android: text="我不是微信" android: textColor="#fff" android: textSize="20sp" android: textStyle="bold"/> 复制代码 TitleFragment.java文件,在这里我们能够看到,可以在各个Fragment当中进行独立的初始化空间并且处理按钮之类的事件,减轻了Activity的负担,我们在Activity中就没有必要写一大推初始化控件和事件响应的代码了,这样就使我们的代码看上去更加的简洁了,可读性大大提高了。 复制代码 publicclassTitleFragmentextendsFragment{ privateImageButtonmButton; @SuppressLint("NewApi") @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ Viewview=inflater.inflate(R.layout.title_fragment,container,false); mButton=(ImageButton)view.findViewById(R.id.id_title_left_btn); mButton.setOnClickListener(newOnClickListener(){ @Override publicvoidonClick(Viewv){ Toast.makeText(getActivity(), "iamanImageButtoninTitleFragment! ", Toast.LENGTH_SHORT).show(); } }); returnview; } } 复制代码 同理还有ContentFragment的布局文件content_fragment.xml 复制代码 xmlversion="1.0"encoding="utf-8"? > android=": // android: layout_width="match_parent" android: layout_height="match_parent" android: orientation="vertical"> android: layout_width="fill_parent" android: layout_height="fill_parent" android: gravity="center" android: text="使用Fragment做主面板" android: textSize="20sp" android: textStyle="bold"/> 复制代码 同理还有ContentFragment.java文件 复制代码 publicclassContentFragmentextendsFragment{ @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState){ returninflater.inflate(R.layout.content_fragment,container,false); } } 复制代码 下面就是主Activity以及他的布局文件 MainActivity.java文件 复制代码 publicclassMainActivityextendsActivity{ @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); } } 复制代码 activity_main.xml文件,在这里我们可以看到,我们把Fragment就当做普通的控件一样,在xml文件中使用。 复制代码 android=": // xmlns: tools=": // android: layout_width="match_parent" android: layout_height="match_parent" tools: context="com.example.staticfragment.MainActivity"> android: name="com.example.staticfragment.TitleFragment" android: id="@+id/title" android: layout_height="45dp" android: layout_width="match_parent"/> android: layout_below="@id/title" android: name="com.example.staticfragment.ContentFragment" android: id="@+id/content" android: layout_height="fill_parent" android: layout_width="fill_parent"/> 复制代码 运行效果截图如下: 注: 由于时间原因,就没有上传源码,如果需要demo源码的话,可以留言,我单独发你一下... 4、动态的使用Fragment 上面已经演示了最简单的使用Fragment的方式,下面分享一下如何动态的添加、更新、以及删除Fragment。 首先是,MainActivity的布局文件activity_main.xml,该文件布局文件上面的顶部是一个TitleFragment,是一个静态声明的Fragment。 中间也是一个Fragment,但是这个Fragment是动态使用的。 最下面是四个按钮。 用include标签包含外部的布局文件进来的。 复制代码 android=": // xmlns: tools=": // android: layout_width="match_parent" android: layout_height="match_parent"> android: id="@+id/id_fragment_title" android: name="com.example.dynamicfragment.TitleFragment" android: layout_width="fill_parent" android: layout_height="45dp"/> android: id="@+id/id_ly_bottombar" android: layout_width="fill_parent" android: layout_height="55dp" android: layout_alignParentBottom="true" layout="@layout/bottombar"/> android: id="@+id/id_content" android: layout_width="fill_parent" android: layout_height="fill_parent" android: layout_above="@id/id_ly_bottombar" android: layout_below="@id/id_fragment_title"/> 复制代码 然后是,MainActivity.java文件。 也是我们这个demo当中最重要的代码文件,首先是将上面的布局文件通过setContentView()加载进来.然后是通过setDefaultFragment();将默认的ContentFragment动态的加载进来。 接下来就是通过我们在最下面防止的四个按钮可以随意的动态切换Fragment。 这也是为什么Fragment会有如此火的原因吧~~~^^ 复制代码 publicclassMainActivityextendsActionBarActivityimplementsOnClickListener{ privateImageButtonmTabWeixin; privateImageButtonmTabFriend; privateImageButtonmTabDiscover; privateImageButtonmTabMe; privateContentFragmentmWeiXinFragment; privateFriendFragmentmFriendFragment; @Override protectedvoidonCreate(BundlesavedInstanceState){ super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); initView(); } publicvoidinitView(){ //初始化控件和声明事件 mTabWeixin=(ImageButton)findViewById(R.id.weixin); mTabFriend=(ImageButton)findViewById(R.id.friend); mTabWeixin.setOnClickListener(this); mTabFriend.setOnClickListener(this); //设置默认的Fragment setDefaultFragment(); } @SuppressLint("NewApi") privatevoidsetDefaultFragment(){ FragmentManagermanager=getFragmentManager(); FragmentTransactiontransaction=manager.beginTransaction(); mWeiXinFragment=newContentFragment(); transaction.replace(R.id.id_content,mWeiXinFragment); mit(); } @SuppressLint("NewApi") @Override publicvoidonClick(Viewv){ FragmentManagerfm=getFragmentManager(); //开启Fragment事务 FragmentTransactiontransaction=fm.beginTransaction(); switch(v.getId()){ caseR.id.weixin: if(mWeiXinFragment==null){ mWeiXinFragment=newContentFragment(); } //使用当前Fragment的布局替代id_content的控件 transaction.replace(R.id.id_content,mWeiXinFragment); break; caseR.id.friend: if(mFriendFragment==null){ mFriendFragment=newFriendFragment(); } transaction.replace(R.id.id_content,mFriendFragment); break; } //transaction.addToBackStack(); //事务提交 mit(); } } 复制代码 从上面的代码,我们可以看出,我们可以使用FragmentManager对Fragment进行动态的加载,这里使用的replace方法~~~下一节我们会详细的介绍FragmentManager的常用API。 。 。 。 ^^ 注: 如果使用android3.0一下的版本,需要引入v4的包,然后Activity继承FragmentActivity,然后通过getSupportFragmentManager()获得FragmentManager对象,不过还是建议把Menifest文件的uses-sdk的minSdkVersion和targetSdkVersion都改为11以上,这样就不必引入v4的包了。 代码的中间有俩个动态加载进来的Fragment,这个和静态使用ragment的声明方式是一样的,写一个继承Fragment的类,然后设置相应的布局,由于时间的关系,我这里只写了俩个Fragment,现在把这俩个的代码页贴出来: 第一个Fragment和他相应的布局文件: 复制代码 publicclassContentFragmentextendsFragment{ @Override publicViewonCreateView(LayoutInflaterinflater,ViewGroupcontainer, BundlesavedInstanceState) { returninflater.inflate(R.layout.fragment_content,container,false); } } 复制代码 复制代码 xmlversion="1.0"encoding="utf-8"? > android=": // android: layout_width="match_parent" android: layout_height="match_parent" android: orientation="vertical">
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Android Fragment 深度解析+ 深度 解析