Android开发之Fragment详解
来源:互联网 发布:淘宝休闲外套 编辑:程序博客网 时间:2024/05/22 17:25
1. 什么是Fragment?
!!!注意每个Fragment都要添加一个id
fragment是一个能够应用于Activity中的独立组件,他封装了功能,所以在activitys和layouts中更容易被复用。
fragment在activity的上下文环境中运行,但是他有自己的生命周期和自己的用户界面,定义一个fragmengts,我们也可以不需要用户界面,也就是无头fragments(headless fragments).
fragments可以被动态或者静态地添加到一个Activity中。
2. 使用fragments的好处
Fragments使得在不同的布局文件中复用组件变得更容易,你可以给手机构建单窗格布局,给平板构建多窗格布局。这并不仅限于用在平板上;例如,你也可以在智能手机上使用fragments去支持横屏和竖屏的布局。
一个典型的例子就是在Activity中项目(items)列表。在平板电脑上,如果你点某个列表项,就能立即在同屏幕右侧看到对应的详细内容(detail),而在智能手机上,你要跳转到一个新的详情页面(detail)。
定义fragments
定义一个新的fragment,你可以继承android.app.Fragment 类或他的一个子类,例如 ListFragment, DialogFragment, PreferenceFragment或者WebViewFragment。下面的代码是一个实现的例子:
package com.example.android.rssfeed;import android.app.Fragment;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.TextView;public class DetailFragment extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View view = inflater.inflate(R.layout.fragment_rssitem_detail, container, false); return view; } public void setText(String item) { TextView view = (TextView) getView().findViewById(R.id.detailsText); view.setText(item); }}
静态添加fragments
要使用一个新的fragment,可以静态地将他添加到一个XML布局文件中
你可以使用FragmentManager类来检查布局文件是否包含了这个fragment
DetailFragment fragment = (DetailFragment) getFragmentManager(). findFragmentById(R.id.detail_frag);if (fragment==null || ! fragment.isInLayout()) { // start new Activity }else { fragment.update(...);}
Fragment生命周期
fragment有他自己的生命周期。但总是和持有他的activity的生命周期相关联。
fragment的onCreate()方法在activity的onCreate()方法之后,该fragment的onCreateView()方法之前被调用。
当fragment开始创建他的用户界面时,系统就调用onCreateView(),在该方法里你可以通过Inflator类的对象调用inflate()方法来inflate一个布局文件,该布局文件作为inflate方法的一个参数。对于headless fragments没有必要实现该方法。
当持有该fragment的activity被创建后,onActivityCreated()方法在onCreateView()方法之后被调用。在这你可以初始化一个需要Context对象的对象。
Fragment并不是Context的子类,所以你必须通过getActivity()方法来获得父activity
一旦fragment可见,onStart()方法就会被调用
如果一个activity停止了,它的fragment也会停止;如果一个activity被销毁,它的fragment也会被销毁。
4.4 fragments之间的通讯
为了增加fragments的复用,fragment和fragment不应该直接和彼此沟通,fragemnts之间的每次沟通都应该通过持有他们的activity来完成。
为了达到该目的,fragment应该定义一个内部接口,然后要求activity必须实现该接口。该方法可以避免fragment对该activity的有任何了解(不懂怎么翻译,原文:This way you avoid that the fragment has any knowledge about the activity which uses it)。在fragment的onAttach()方法中,可以检查activity是否正确实现了该接口。
*实现fragment的详细步骤:*
1.在XML文件中定义name属性指向继承自Fragment的Activitv,并设置XML中Fragment的id(注意id一定要设置,不然显示不出来!)
2.新建一个类继承自Fragment,重写其onCreateView()方法!并设置其返回值View view=inflater.inflate(R.layout.my_activity, container);
return view;
*获取fragment的id实例对象:*
//通过getFragmentManager().findFragmentById方法获取id
MyActivity myactivity;//此引用继承自 Fragment
myactivity=(MyActivity) getFragmentManager().findFragmentById(R.id.my_fragment);
返回值为继承自 Fragment 的Activity的类引用
*通过java代码的方式添加Fragment*
private void addFragmentContent() { /* *实现逻辑: *获取Fragment管理器 *通过Fragment管理器开启事务 *通过事务的:add()添加方法,remove()删除方法,replace()替换方法,执行相关逻辑 */ //通过代码添加Fragment FragmentManager fm=getFragmentManager(); //开启一个事务 FragmentTransaction ft=fm.beginTransaction(); MyActivity mA=new MyActivity(); //添加一个内容到Fragment当中 ft.add(R.id.my_fragment,mA); //ft.remove();//删除的方法 //ft.replace(, fragment)//替换的方法 ft.commit();//最后一定要提交事务 }
Android Fragment用法详解(1)–静态使用Fragment超详解传送门:
http://www.cnblogs.com/linfenghp/p/5560015.html
Android Fragment用法详解(2)–动态添加Fragment超详解传送门:
http://www.cnblogs.com/linfenghp/p/5561023.html
Fragment出入栈操作:
//第一步online_fg=new OnLineFragment(); ft.replace(R.id.fillContent_LinearLayout,online_fg);//替换的方法 //把fragment添加到返回栈中 ft.addToBackStack(null); ft.commit();//最后一定要提交事//第二步重写onKeyDown方法@Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub if(keyCode==KeyEvent.KEYCODE_BACK) { if(getFragmentManager().getBackStackEntryCount()==0) { finish(); }else { getFragmentManager().popBackStack(); } } return true; }
Fragment传参方式
小知识:使用这种官方推荐的传参方式,横竖屏切换的时候内容就不会没有了
//传参方法 public static OnLineFragment getInstantce(String title) { OnLineFragment fragment=new OnLineFragment(); Bundle b=new Bundle(); b.putString("title",title); fragment.setArguments(b); return fragment; } //获取tv.setText(getArguments().getString("title"));
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android 开发 之 Fragment 详解
- Android开发之Fragment详解
- Android UI开发详解之Fragment
- Android UI开发详解之Fragment
- Android UI开发详解之Fragment
- Android UI开发详解之Fragment
- Android开发之Fragment详解(一)
- Android UI开发详解之Fragment
- Android开发之Fragment
- android开发之Fragment
- Android开发之fragment
- android开发之Fragment 的生命周期及使用方法详解
- AI会毁灭人类??
- 网络编程之Winsock2 服务提供者接口(SPI)
- BFS 非常可乐
- Shopping Offers POJ
- 前台js(canvas)生成图片,通过后台java进行保存
- Android开发之Fragment详解
- Servlet中的service方法
- 鼠标事件
- 自学HTML
- 双鸭山大学
- Node
- 网络编程之编写LSP进行Winsock API监控拦截或LSP注入
- 《Effective Java》(7~8)阅读笔记
- java学习旅程