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"));
原创粉丝点击