Android Layouts(Fragment)详解

来源:互联网 发布:python参考手册 编辑:程序博客网 时间:2024/06/16 03:32
目录:
    1.Fragment概述
    2.Fragment的生命周期
    3.Fragment静态添加使用
    4.Fragment的动态添加使用
    5.Fragment之间的通信
    6.Fragment与Activity的通信
        6.1 简单方法
        6.2 接口实现
        6.3 Intent实现
        6.4 其他
    
1.Fragment概述
    Fragment(碎片)是在android3.0(API 11)推出的一款非常类似于Activity的控件,他的设计初衷在于解决aplication在不同平台
的灵活UI显示,例如:手机与平板,手机显示一个Activity可能看起来比较漂亮,可是如果换到大屏的平板上就不那么美丽了,所以Fragment
的出现,为大屏显示更多的View提供了很好的支持,换句话说Fragment就是把Activity这个“大房间”隔开为自定义的“小房间”,而在不同的
房间可以实现不同的功能,各个“小房间”独立互不干扰,也可进行通信,同时生命周期与“大房间”是关联的。除此之外,Fragment也具备可复
用性和对UI进行分组管理作用。

2.Fragment的生命周期
    2.1)下面用代码和Log演示一下Fragment与Activity的生命周期的关系以及各个回调方法的执行顺序
    操作顺序:启动->menu键返回->再次启动->back退出
    1)Log输出如下:
08-21 04:47:16.169 1164-1164/com.example.fragment I/MainActivity: MainActivity->onCreate()08-21 04:47:16.173 1164-1164/com.example.fragment D/fragment1: fragment1->onAttach()08-21 04:47:16.173 1164-1164/com.example.fragment D/fragment1: fragment1->onCreate()08-21 04:47:16.173 1164-1164/com.example.fragment D/fragment1: fragment1->onCreateView()08-21 04:47:16.173 1164-1164/com.example.fragment I/MainActivity: MainActivity->onStart()08-21 04:47:16.173 1164-1164/com.example.fragment D/fragment1: fragment1->onActivityCreated()08-21 04:47:16.173 1164-1164/com.example.fragment D/fragment1: fragment1->onStart()08-21 04:47:16.185 1164-1164/com.example.fragment I/MainActivity: MainActivity->onResume()08-21 04:47:16.185 1164-1164/com.example.fragment D/fragment1: fragment1->onResume()08-21 04:47:22.177 1164-1164/com.example.fragment I/MainActivity: MainActivity->onPause()08-21 04:47:22.177 1164-1164/com.example.fragment D/fragment1: fragment1->onPause()08-21 04:47:22.777 1164-1164/com.example.fragment I/MainActivity: MainActivity->onStop()08-21 04:47:22.777 1164-1164/com.example.fragment D/fragment1: fragment1->onStop()08-21 04:47:26.149 1164-1164/com.example.fragment I/MainActivity: MainActivity->onRestart()08-21 04:47:26.149 1164-1164/com.example.fragment I/MainActivity: MainActivity->onStart()08-21 04:47:26.149 1164-1164/com.example.fragment D/fragment1: fragment1->onStart()08-21 04:47:26.149 1164-1164/com.example.fragment I/MainActivity: MainActivity->onResume()08-21 04:47:26.149 1164-1164/com.example.fragment D/fragment1: fragment1->onResume()08-21 04:47:28.401 1164-1164/com.example.fragment I/MainActivity: MainActivity->onPause()08-21 04:47:28.401 1164-1164/com.example.fragment D/fragment1: fragment1->onPause()08-21 04:47:28.877 1164-1164/com.example.fragment I/MainActivity: MainActivity->onStop()08-21 04:47:28.877 1164-1164/com.example.fragment D/fragment1: fragment1->onStop()08-21 04:47:28.877 1164-1164/com.example.fragment I/MainActivity: MainActivity->onDestroy()08-21 04:47:28.877 1164-1164/com.example.fragment D/fragment1: fragment1->onDestroyView()08-21 04:47:28.877 1164-1164/com.example.fragment D/fragment1: fragment1->onDestroy()08-21 04:47:28.877 1164-1164/com.example.fragment D/fragment1: fragment1->onDetach()
  
    2)activity_main.xml
    
<?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.fragment.MainActivity"><fragment    android:layout_width="match_parent"    android:id="@+id/fragment1"    android:name="com.example.fragment.Fragment1"    android:layout_height="match_parent"></fragment></RelativeLayout>

    
    3)fragment1.xml
    
<?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.fragment.MainActivity"><TextView    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:text="这是第一个Fragment"/></RelativeLayout>
    
    4)MainActivity.java
    package com.example.fragment;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;import android.util.Log;public class MainActivity extends AppCompatActivity {    private final String Tag="MainActivity";    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.i(Tag, "MainActivity->onCreate()");        setContentView(R.layout.activity_main);    }    @Override    protected void onStart() {        Log.i(Tag, "MainActivity->onStart()");        super.onStart();    }    @Override    protected void onRestart() {        Log.i(Tag, "MainActivity->onRestart()");        super.onRestart();    }    @Override    protected void onResume() {        Log.i(Tag, "MainActivity->onResume()");        super.onResume();    }    @Override    protected void onPause() {        Log.i(Tag, "MainActivity->onPause()");        super.onPause();    }    @Override    protected void onStop() {        Log.i(Tag, "MainActivity->onStop()");        super.onStop();    }    @Override    protected void onDestroy() {        Log.i(Tag, "MainActivity->onDestroy()");        super.onDestroy();    }}
  
    5)Fragment1.java
    
package com.example.fragment;import android.app.Activity;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by elimy on 2016-08-21. */public class Fragment1 extends Fragment {    private  final  String Tag ="fragment1";    /*    * 调用时间:绘制界面的时候回调,返回Fragment view    * 参数:    *   inflater布局加载器用于从xml加载fragment    *   container:指示fragment存放的parent view    *   savedInstanceState:有人解释说是,如果是true,fragment xml布局会加入到parent view    *       的ViewGroup中,则根元素就是container,如果为false,fragment xml会作为单独的view    *       返回,根元素为fragment xml的根元素,没有深入了解就不装逼了,大家自己去学习学习大神们的吧    * */    @Nullable    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        Log.d(Tag,"fragment1->onCreateView()");        return inflater.inflate(R.layout.fragment,container,false);    }    /*    * 调用时间:在Fragment绑定到Activity时调用,只调用一次    * activity:及绑定的activity    * */    @Override    public void onAttach(Activity activity) {        Log.d(Tag,"fragment1->onAttach()");        super.onAttach(activity);    }    /*    * 调用时间:在Fragment创建时调用,只调用一次    * */    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        Log.d(Tag, "fragment1->onCreate()");    }    /*  * 调用时间:在Fragment所在的Activity创建完成后调用  * */    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        Log.d(Tag,"fragment1->onActivityCreated()");        super.onActivityCreated(savedInstanceState);    }    /*    * 调用时间:Fragment启动时回调    * */    @Override    public void onStart() {        Log.d(Tag,"fragment1->onStart()");        super.onStart();    }    /*    * 调用时间:Fragment获取焦点是回调    * */    @Override    public void onResume() {        Log.d(Tag,"fragment1->onResume()");        super.onResume();    }    /*    *调用时间:Fragment暂停,并进入后台未获取焦点时回调    * */    @Override    public void onPause() {        Log.d(Tag,"fragment1->onPause()");        super.onPause();    }    /*    * 调用时间:Fragment停止时回调    * */    @Override    public void onStop() {        Log.d(Tag,"fragment1->onStop()");        super.onStop();    }    /*    * 调用时间: 销毁 Fragement 绘制的 View 组件时回调    * */    @Override    public void onDestroyView() {        super.onDestroyView();        Log.d(Tag, "fragment1->onDestroyView()");    }    /*    * 调用时间: 销毁 Fragement 回调    * */    @Override    public void onDestroy() {        Log.d(Tag,"fragment1->onDestroy()");        super.onDestroy();    }    /*    * 调用时间:  Fragement与Activity解绑时回调    * */    @Override    public void onDetach() {        Log.d(Tag,"fragment1->onDetach()");        super.onDetach();    }}

 
    2.2)看一张Fragment的生命周期图(来至官方文档)

3.Fragment静态添加使用
    如2添加Fragment的方式即为静态添加,一般步骤如下:
       1)在主布局添加如下代码,并且用 android:name=""属性指定fragment的java类
<fragment    android:layout_width="match_parent"    android:id="@+id/fragment1"    android:name="com.example.fragment.Fragment1"    android:layout_height="match_parent">    

       2)建立fragment的java类,并通过inflater.inflate(R.layout.fragment,container,false);
           加载fragment xml布局,并返回View.
           
       3)建立对应的fragment xml文件实现对应的布局
       
4.Fragment的动态添加使用
    4.1)定义fragment_girl1.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"><ImageView    android:background="@drawable/a"    android:layout_width="match_parent"    android:layout_height="match_parent" /></RelativeLayout>

 
    4.2)定义Fragment_girl1.java
    
package com.example.fragment;//注意这里是导入的android.app包下的Fragmentimport android.app.Fragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by elimy on 2016-08-21. */public class Fragment_girl1 extends Fragment {    public Fragment_girl1() {        super();    }    @Nullable    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_girl1,container,false);    }}   

 
    4.3)定义fragment_girl2.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:layout_height="match_parent"><ImageView    android:background="@drawable/b"    android:layout_width="wrap_content"    android:layout_height="wrap_content"    android:layout_alignParentBottom="true"    android:layout_alignParentRight="true"    android:layout_alignParentEnd="true"    android:layout_alignParentTop="true"    android:layout_alignParentLeft="true"    android:layout_alignParentStart="true" /></RelativeLayout>

 
    4.4)定义Fragment_girl2.java    
    
package com.example.fragment;//注意这里导入的是android.support.v4.app包下的Fragmentimport android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by elimy on 2016-08-21. */public class Fragment_girl2 extends Fragment {    public Fragment_girl2() {        super();    }    @Nullable    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_girl2,container,false);    }}

 
    4.5)定义主布局activity_three.xml
 
<?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:id="@+id/activity_three_layout"    android:padding="10dp"    tools:context="com.example.fragment.MainActivity"><Button    android:id="@+id/add"    android:text="动态添加Fragment"    android:layout_width="wrap_content"    android:layout_height="wrap_content" />    <Button        android:layout_toRightOf="@+id/add"        android:layout_marginLeft="10dp"        android:id="@+id/v4_add"        android:text="V4动态添加Fragment"        android:layout_width="wrap_content"        android:layout_height="wrap_content" /></RelativeLayout>
  
    4.6)定义主布局java类ThreeActivity.java
package com.example.fragment;import android.os.Bundle;import android.support.v4.app.FragmentManager;import android.support.v4.app.FragmentTransaction;import android.support.v7.app.AppCompatActivity;import android.transition.Transition;import android.view.View;import android.widget.Button;/** * Created by elimy on 2016-08-21. */public class ThreeActivity extends AppCompatActivity {    private Button add,v4_add;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_three);        add= (Button) findViewById(R.id.add);        v4_add= (Button) findViewById(R.id.v4_add);        add.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //记得这里面的Fragment也是非V4包下的哦                Fragment_girl1 girl1 = new Fragment_girl1();                //实例化非V4包下的FragmentManager                android.app.FragmentManager fragmentManager = getFragmentManager();                //实例化非V4包下的FragmentTransaction                android.app.FragmentTransaction transaction = fragmentManager.beginTransaction();                //替换原来的布局                transaction.replace(R.id.activity_three_layout,girl1);                //提交事务                transaction.commit();            }        });        v4_add.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //实例化V4包下的FragmentManager                FragmentManager fragmentManager =getSupportFragmentManager();                //实例化FragmentTransaction对象                FragmentTransaction v4_transaction = fragmentManager.beginTransaction();                //实例化自定义的碎片                Fragment_girl2 girl2 = new Fragment_girl2();                //替换掉activity的根布局                v4_transaction.replace(R.id.activity_three_layout,girl2);                //提交事务                v4_transaction.commit();            }        });    }}
  
    4.7)效果截图
        分别是替换前效果,点击add button后效果和点击v4_add button后效果

5.Fragment之间的通信    
    我用两个妹纸来做一个两个Fragment妹纸的对话
    
    5.1)导入图片
    5.2)主布局activity_main.xml
<?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.fragmentdemo.MainActivity">    <fragment        android:id="@+id/girlOneFg"        android:layout_width="match_parent"        android:name="com.example.fragmentdemo.GirlOneFragment"        android:layout_height="wrap_content"        tools:layout="@layout/fragment_one">    </fragment>    <fragment        android:layout_below="@+id/girlOneFg"        android:id="@+id/girlTwoFg"        android:layout_width="match_parent"        android:name="com.example.fragmentdemo.GirlTwoFragment"        android:layout_height="wrap_content"        tools:layout="@layout/fragment_two">    </fragment></RelativeLayout>
 
    5.3)主布局java类MainActivity.java
    
package com.example.fragmentdemo;import android.support.v7.app.AppCompatActivity;import android.os.Bundle;public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);    }}   

  
    5.4)第一个妹纸Fragment的xml布局fragment_one.xml
    
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="@drawable/a"    android:layout_height="wrap_content">    <LinearLayout        android:id="@+id/first_linear"        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <EditText            android:id="@+id/edit"            android:layout_width="0dp"            android:layout_weight="5"            android:hint="你想对她说..."            android:layout_height="wrap_content" />        <Button            android:text="发送"            android:textColor="@color/colorPrimary"            android:id="@+id/send_one"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="wrap_content" />    </LinearLayout>    <LinearLayout        android:layout_below="@+id/first_linear"        android:layout_marginTop="10dp"        android:id="@+id/second_linear"        android:orientation="horizontal"        android:gravity="center"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:id="@+id/girl1_tv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="女孩二说:"/>        <TextView            android:id="@+id/girl2_say"            android:textColor="@color/colorAccent"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="say"/>    </LinearLayout></RelativeLayout>

   
    5.5)第一个妹子Fragment的java类实现GirlOneFragment.java
 
package com.example.fragmentdemo;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;/** * Created by elimy on 2016-08-22. */public class GirlOneFragment extends Fragment {    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_one, container, false);    }    /** 调用时间:在Fragment所在的Activity创建完成后调用* */    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        //通过Fragment的getActivity()方法获取到宿主Activity在根据宿主Activity的findViewById()寻找相应的空间        Button add = (Button) getActivity().findViewById(R.id.send_one);        final EditText edit1= (EditText) getActivity().findViewById(R.id.edit);        final TextView girl1_say= (TextView) getActivity().findViewById(R.id.girl1_say);        //为girl1的发送按钮添加监听        add.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //获取输入框的文字                String content = edit1.getText().toString().trim();                //设置到girl2 fragment显示                girl1_say.setText(content);            }        });        super.onActivityCreated(savedInstanceState);    }}   


    5.6)第二个妹纸Fragment的xml布局fragment_two.xml
<?xml version="1.0" encoding="utf-8"?><RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    android:layout_width="match_parent"    android:background="@drawable/b"    android:layout_height="wrap_content">    <LinearLayout        android:id="@+id/three_linear"        android:orientation="horizontal"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <EditText            android:id="@+id/edit_two"            android:layout_width="0dp"            android:layout_weight="5"            android:hint="你想对她说..."            android:singleLine="true"            android:layout_height="wrap_content" />        <Button            android:text="发送"            android:textColor="@color/colorPrimary"            android:id="@+id/send_two"            android:layout_width="0dp"            android:layout_weight="1"            android:layout_height="wrap_content" />    </LinearLayout>    <!--    <ImageView            android:id="@+id/iv_girl2"            android:layout_below="@+id/first_linear"            android:background="@drawable/b"            android:layout_width="wrap_content"            android:layout_height="wrap_content" />-->    <LinearLayout        android:layout_below="@+id/three_linear"        android:layout_marginTop="10dp"        android:id="@+id/four_linear"        android:orientation="horizontal"        android:gravity="center"        android:layout_width="match_parent"        android:layout_height="wrap_content">        <TextView            android:id="@+id/girl2_tv"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="女孩一说:"/>        <TextView            android:id="@+id/girl1_say"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:textColor="@color/colorAccent"            android:text="say"/>    </LinearLayout></RelativeLayout>

 
    5.7)第二个妹子Fragment的java类实现GirlTwoFragment.java
    
package com.example.fragmentdemo;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.TextView;/** * Created by elimy on 2016-08-22. */public class GirlTwoFragment extends Fragment {    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_two, container, false);    }    /** 调用时间:在Fragment所在的Activity创建完成后调用* */    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        //通过Fragment的getActivity()方法获取到宿主Activity在根据宿主Activity的findViewById()寻找相应的空间        Button add = (Button) getActivity().findViewById(R.id.send_two);        final EditText edit2= (EditText) getActivity().findViewById(R.id.edit_two);        final TextView girl2_say= (TextView) getActivity().findViewById(R.id.girl2_say);        //为girl2的发送按钮添加监听        add.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                //获取输入框的文字                String content = edit2.getText().toString().trim();                //设置到girl1 fragment显示                girl2_say.setText(content);            }        });        super.onActivityCreated(savedInstanceState);    }}
   
    5.8)效果截图    



6.Fragment与Activity的通信    

    6.1 简单方法
        (1)Fragment可通过getActivity()方法获取宿主Activity从而实现调用Activity和FragmentActivity类的
            一些public类型方法,例如:findViewById()
            
        (2)Activity与Fragment可以通过如下代码实例化Fragment并调用它的方法    
            
            //通过findFragmentById()实例化GirlOneFragment,参数来着GirlOneFragment对应的主布局xml中的fragment id值            GirlOneFragment girlOneFragment1= (GirlOneFragment) getSupportFragmentManager().findFragmentById(R.id.girlOneFg);            //通过实例化调用GirlOneFragment的自定义GetString()方法            girlOneFragment1.GetString();            //通过findFragmentByTag()实例化GirlOneFragment            GirlOneFragment girlOneFragment2 = getSupportFragmentManager().findFragmentByTag()            //直接new            GirlOneFragment girlOneFragment = new GirlOneFragment();            //调用GirlOneFragment自定义方法GetString()            girlOneFragment.GetString();

      
    6.2 接口实现
        (1)定义一个通讯的Fragement类InterfaceContactFragment.java
        
package com.example.fragmentdemo2;import android.app.Activity;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by elimy on 2016-08-23. */public class InterfaceContactFragment extends Fragment {    //定义接口成员变量    public ShowMessage showMessageCallback;    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_contact, container, false);    }    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        //因为宿主Activity继承了ShowMessage接口,所以可以强制类型转换        showMessageCallback = (ShowMessage) activity;        showMessageCallback.showMessage(this,"Hello activity,I am InterfaceContactFragment!");    }    //定义通信接口    public interface ShowMessage{        public void showMessage(Fragment fragment, String info);    }}    
   
        (2)宿主活动对信息的接收实现MainActivity.java            
 
package com.example.fragmentdemo2;import android.os.Bundle;import android.os.PersistableBundle;import android.support.v4.app.Fragment;import android.support.v7.app.AppCompatActivity;import android.util.Log;/** * Created by elimy on 2016-08-23. */public class MainActivity extends AppCompatActivity implements InterfaceContactFragment.ShowMessage{    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);/*        //实例化自定义Fragment        InterfaceContactFragment interfaceContactFragment= new InterfaceContactFragment();        //实例化FragmentManager        FragmentManager fragmentManager=getSupportFragmentManager();        //实例化FragmentTransaction        FragmentTransaction transaction = fragmentManager.beginTransaction();        //通过事务replace()方法替换掉原来的布局        transaction.replace(R.id.fragment_linear,interfaceContactFragment);        //提交事务        transaction.commit();*/    }    /* 继承InterfaceContactFragment的内部ShowMessage接口并实现showMessage方法      *这里参数由fragment Attach到activity时由实例化的接口成员变量调用回调方法传递过来      */    @Override    public void showMessage(Fragment fragment, String info) {        Log.d("showMessage",info+fragment.getId());    }}  

   
    6.3 Intent广播实现

        (1)InterfaceContactFragment.java中注册Intent并发送广播

       

package com.example.fragmentdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.support.annotation.Nullable;import android.support.v4.app.Fragment;import android.support.v4.content.LocalBroadcastManager;import android.util.Log;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;/** * Created by elimy on 2016-08-23. */public class InterfaceContactFragment extends Fragment {    @Nullable    @Override    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {        return inflater.inflate(R.layout.fragment_contact, container, false);    }    @Override    public void onAttach(Activity activity) {        super.onAttach(activity);    }    @Override    public void onActivityCreated(@Nullable Bundle savedInstanceState) {        super.onActivityCreated(savedInstanceState);        /*        *   Intent intent1 = new Intent();        *    intent.setAction("android.intent.action.BROADCAST")        * */        //通过带参构造方法实例化Intent,与上面效果相同        Intent intent = new Intent("android.intent.action.BROADCAST");        //为意向添加数据(键值对形式)        intent.putExtra("msg","Hello, I am InterfaceContactFragment");        //实例化LocalBroadcastManager类        LocalBroadcastManager broadcastManager =LocalBroadcastManager.getInstance(getActivity());        //发送隐式broadcast        broadcastManager.sendBroadcast(intent);        Log.d("onActivityCreated","onActivityCreated()");    }}
         

        (2)SecondActivity.java宿主或其他Activity注册广播接收者接收广播
 
package com.example.fragmentdemo;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.content.IntentFilter;import android.os.Bundle;import android.support.v4.content.LocalBroadcastManager;import android.support.v7.app.AppCompatActivity;import android.util.Log;/** * Created by elimy on 2016-08-23. */public class SecondActivity extends AppCompatActivity{    BroadcastReceiver broadcastReceiver;    LocalBroadcastManager broadcastManager;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_second);        //实例化broadcastManager         broadcastManager =LocalBroadcastManager.getInstance(this);        //实例化过滤器onReceive        IntentFilter filter = new IntentFilter("android.intent.action.BROADCAST");        //实例化BroadcastReceiver并实现继承方法接收数据         broadcastReceiver = new BroadcastReceiver() {            @Override            public void onReceive(Context context, Intent intent) {                //根据键值获取消息                Log.d("","onReceive()");                String s =intent.getStringExtra("msg");                Log.d("GetMessage",s);            }        };        //动态注册广播接收者        broadcastManager.registerReceiver(broadcastReceiver,filter);    }    @Override    protected void onDestroy() {        super.onDestroy();        Log.d("onDestroy","onDestroy()");        broadcastManager.unregisterReceiver(broadcastReceiver);    }}
      
注意:我们在onCreate()中registerReceiver的broadcastReceiver需要在onDestroy()中unregisterReceiver
        在onStart()中registerReceiver的broadcastReceiver需要在onStop()中unregisterReceiver不然会抛出异常,至于原因
        伙伴们可以想想Activity的生命周期,就明白了。
    
    6.4 其他还包括通过EventBus和handler去实现fragment和Activity与fragment之间的通信,感兴趣的伙伴可以搜索学习
这里就不一一列举了。

  推荐参考:http://www.jianshu.com/p/1b824e26105b
                    http://blog.csdn.net/u012702547/article/details/49786417
   
0 0