Fragment的生命周期和Activity之间的通信以及使用

Fragment通俗来讲就是碎片,不能单独存在,意思就是说必须依附于Activity,一般来说有两种方式把Fragment加到Activity,分为静态,动态。

静态即为右键单击,建立一个Fragment,选择Blank,在Activity布局中直接加fragment,name属性直接指向之前建立的Fragment,这就添加上了Fragment,这种较为简单。

动态:

我们要做的是在Activity中添加一个Fragment,Fragment中有两个按钮,当按下按钮时分别切换不同的Fragment,注意,切换不同的Fragment的代码在Activity中写。

实现Fragment和Activity之间的通信,步骤一般分为五步,1、在Fragment中声明一个接口。 2、在Activity中实现在Fragment中声明的接口。

3、在Fragment中声明一个接口对象。 4、在Fragment的生命周期中onAttach方法中判断当前Activity是否实现了此Fragment中声明的接口

5、调用Activity中实现的方法 (接口对象.方法名)

首先,建立一个名为OneFragment的Fragment,在右键单击建立时勾选Include fragment factory methods 和Include interface callback,这样会自动添加相关代码,省掉很多时间.再在新建立的Fragment里添加两个按钮,设置Id。

布局代码如下

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    tools:context="com.example.administrator.homeworepar.Fragment.OneFragment">

    <!-- TODO: Update blank fragment layout -->    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/bt1"        android:text="好友"/>

    <Button        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:id="@+id/bt2"        android:text="消息"        android:layout_gravity="center_horizontal|top" />

</FrameLayout>

下面为Fragment的代码
package com.example.administrator.homeworepar.Fragment;

import android.content.Context;import android.os.Bundle;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;

import com.example.administrator.homeworepar.R;

/** * A simple {@link Fragment} subclass. * Activities that contain this fragment must implement the * {@link OneFragment.OnFragmentInteractionListener} interface * to handle interaction events. * Use the {@link OneFragment#newInstance} factory method to * create an instance of this fragment. */public class OneFragment extends Fragment {    // TODO: Rename parameter arguments, choose names that match    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER    private static final String ARG_PARAM1 = "param1";    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters    private String mParam1;    private String mParam2;

    private OnFragmentInteractionListener mListener;

    public OneFragment() {        // Required empty public constructor    }

    /**     * Use this factory method to create a new instance of     * this fragment using the provided parameters.     *     * @param param1 Parameter 1.     * @param param2 Parameter 2.     * @return A new instance of fragment OneFragment.     */    // TODO: Rename and change types and number of parameters    public static OneFragment newInstance(String param1, String param2) {        OneFragment fragment = new OneFragment();        Bundle args = new Bundle();        args.putString(ARG_PARAM1, param1);        args.putString(ARG_PARAM2, param2);        fragment.setArguments(args);        return fragment;    }

    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        if (getArguments() != null) {            mParam1 = getArguments().getString(ARG_PARAM1);            mParam2 = getArguments().getString(ARG_PARAM2);        }    }

    @Override    public View onCreateView(LayoutInflater inflater, ViewGroup container,                             Bundle savedInstanceState) {        // Inflate the layout for this fragment        View view=inflater.inflate(R.layout.fragment_one, container, false);        Button bt1= (Button) view.findViewById(R.id.bt1);       // 实现的功能是的那个按下按钮时,会调用ACtivity中的changFragment方法                           bt1.setOnClickListener(new View.OnClickListener() {                    @Override            public void onClick(View v) {                mListener.changFragment(1);            }        });        Button bt2= (Button) view.findViewById(R.id.bt2);        bt2.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                mListener.changFragment(2);            }        });        return view;    }

    @Override    public void onAttach(Context context) {                                         super.onAttach(context);                                        if (context instanceof OnFragmentInteractionListener) {                   判断是否实现了接口,如果实现了接                                                                                  口,就把Activity转换为接口的对                                                                                  象,这样就可以调用方                                                                                           法            mListener = (OnFragmentInteractionListener) context;        } else {            throw new RuntimeException(context.toString()                    + " must implement OnFragmentInteractionListener");        }    }

    @Override    public void onDetach() {        super.onDetach();        mListener = null;    }

    /**     * This interface must be implemented by activities that contain this     * fragment to allow an interaction in this fragment to be communicated     * to the activity and potentially other fragments contained in that     * activity.     * <p/>     * See the Android Training lesson <a href=     * "http://developer.android.com/training/basics/fragments/communicating.html"     * >Communicating with Other Fragments</a> for more information.     */    public interface OnFragmentInteractionListener {    //  此段为自动添加的接口,在接口中实现一个方法修改完后会有其他代码出错,只要                                                            把出错代码删掉即可。        // TODO: Update argument type and name        void changFragment(int  which);    }
 

再建立一个Activity,

package com.example.administrator.homeworepar.Fragment;

import android.os.Bundle;import android.support.v4.app.Fragment;import android.support.v7.app.AppCompatActivity;

import com.example.administrator.homeworepar.R;

public class Fragment2Activity extends AppCompatActivity implements OneFragment.OnFragmentInteractionListener {

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_fragment2);    }    @Override    public void changFragment(int which) {        if(which==1){            Fragment fragment1=new BlankFragment();   //实现Fragment中的方法,当得到的值为1时,把BlankFragment填充                                                       //到Id为fl2中的FrameLayout中,
getSupportFragmentManager()
                    .beginTransaction().replace(R.id.fl2,fragment1).commit();        }else if(which==2){            Fragment fragment2=new SecondFragment();            getSupportFragmentManager()                    .beginTransaction().replace(R.id.fl2,fragment2).commit();        }    }}

ACtivity布局代码如下
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools"    android:layout_width="match_parent"    android:layout_height="match_parent"    android:paddingBottom="@dimen/activity_vertical_margin"    android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    tools:context="com.example.administrator.homeworepar.Fragment.Fragment2Activity"> <fragment     android:layout_width="match_parent"     android:layout_height="50dp"     android:name="com.example.administrator.homeworepar.Fragment.OneFragment"     android:id="@+id/fragment3" />    <FrameLayout        android:layout_width="match_parent"        android:layout_height="match_parent"        android:id="@+id/fl2"        android:layout_below="@+id/fragment3">

    </FrameLayout></RelativeLayout>这样就可以实现ACtivity与Fragment间的通信,另外Fragment还有和Activity一样还有生命周期的问题

方法名 说明
onAttach () Fragment被附加到Activity的时,调用此函数,在这个方法中可以获得宿主Activity。
onCreate () Fragment被创建的时,调用此函数。
onCreateView () Fragment的布局加载时,调用此函数。
onActivityCreated () 当宿主Activity启动完毕后,调用此函数。
onStart () 启动Fragment时,调用此函数。
onResume () Fragment恢复时,调用此函数。
onPause () Fragment暂停时,调用此函数。
onStop() Fragment停止时,调用此函数。
onDestroyView() 销毁Fragment中的View控件时,调用此函数。
onDestroy() 销毁Fragment时,调用此函数。
onDetach() Fragment从Activity脱离时,调用此函数

 
时间: 2024-12-23 20:30:56

Fragment的生命周期和Activity之间的通信以及使用的相关文章

Fragment的生命周期&amp;同一Activity下不同Fragment之间的通信

Android开发:碎片Fragment完全解析(2) Fragment的生命周期 和Activity一样,Fragment也有自己的生命周期,理解Fragment的生命周期非常重要,我们通过代码的方式来瞧一瞧Fragment的生命周期是什么样的: 1 publicclass Fragment1 extends Fragment { 2 publicstaticfinal String TAG = "Fragment1"; 3 @Override 4 public View onCre

android中fragment的使用及与activity之间的通信

一.fragment的生命周期,具体方法什么时候调用就不说了. 二 在activity中使用fragment和通信有两种常见的方式, 1.静态的方式 (1)定义一个类继承Fragment,如 MyFragment,这里复写onCreateView()方法和onAttach()方法 (2)onCreateView()加载一些布局对象以及设置View对象,并返回一个View对象,onAttach()通信的时候用到 (3)在activity的layout的布局文件中引用Fragment继承类(注意设置

Android成长日记-Fragment的生命周期与Activity通信

1. public void onAttach(Activity activity) 当Fragment被添加到Activity时候会回调这个方法,并且这个方法只会被回调一次 2. public void onCreate(Bundle saveInstanceState) 创建Fragment的时候被回调,只会被调用一次 3. public void onActivityCreated(Bundle saveInstanceState) 当Fragment所在的Activity启动完成后调用

Fragment的生命周期

Fragment的生命周期有11个,比Activity的生命周期会复杂不少,而且Fragment的生命周期同Activity的生命周期的穿插的执行的,看图: 其中背景为蓝色的为Activity的生命周期,其他的为Fragment周期,由图可以看出,在Fragment初始化完成前,相同的生命周期都是Activity先执行的,而进入销毁的周期时,就变成了Fragment的先执行. 1.  public void onAttach(Activity activity)方法 执行完该方法,Fragmen

Android——Fragment和Activity之间的通信+Frangment生命周期

Android--Fragment和Activity之间的通信+Frangment生命周期 Fr'agment和Activity之间的通信 1.在Fragment中声明一个接口. 2.在Activity中实现在Fargment中声明的接口. 3.在Fragment中声明一个接口对象. 4.在Frangment的生命周期Onattach方法中判断当前Activity是否实现了此Fragment中声明的接口.如果已实现,就把当前Activity转换成接口对象. 5.调用Activity中实现的方法=

Activity和Fragment的生命周期

Activity和Fragment的生命周期

Fragment的总结:Fragment的生命周期及与Activity生命周期的对比

1.Fragment的生命周期: 先看Google帮助文档中给出的图示: //附加Fragment到当前Activity上. public void onAttach(Activity activity) { // TODO Auto-generated method stub super.onAttach(activity); } public void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method st

Activity与Fragment的生命周期测试

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"                 xmlns:tools="http://schemas.android.com/tools"                 android:layout_width="match_parent"                 android:layout_hei

Fragment 整个生命周期演示

Fragment生命周期主要体现在以下表中13个方法里,以下是按照Fragment从开始到销毁的先后执行顺序排序. 序号 方法名称 描述 1 public void onInflate(Activity activity, AttributeSet attrs,BundlesavedInstanceState) 在Activity.onCreate方法之前调用,可以获取除了View之外的资源 2 public void onAttach(Activity activity) 当fragment第