Android Layouts(Fragment)详解
来源:互联网 发布:python参考手册 编辑:程序博客网 时间:2024/06/16 06:02
目录:
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输出如下:
2)activity_main.xml
3)fragment1.xml
4)MainActivity.java
5)Fragment1.java
2.2)看一张Fragment的生命周期图(来至官方文档)
3.Fragment静态添加使用
如2添加Fragment的方式即为静态添加,一般步骤如下:
1)在主布局添加如下代码,并且用 android:name=""属性指定fragment的java类
2)建立fragment的java类,并通过inflater.inflate(R.layout.fragment,container,false);
加载fragment xml布局,并返回View.
3)建立对应的fragment xml文件实现对应的布局
4.Fragment的动态添加使用
4.1)定义fragment_girl1.xml
4.2)定义Fragment_girl1.java
4.3)定义fragment_girl2.xml
4.4)定义Fragment_girl2.java
4.5)定义主布局activity_three.xml
4.6)定义主布局java类ThreeActivity.java
4.7)效果截图
分别是替换前效果,点击add button后效果和点击v4_add button后效果
我用两个妹纸来做一个两个Fragment妹纸的对话
5.1)导入图片
5.2)主布局activity_main.xml
5.3)主布局java类MainActivity.java
5.4)第一个妹纸Fragment的xml布局fragment_one.xml
5.5)第一个妹子Fragment的java类实现GirlOneFragment.java
5.6)第二个妹纸Fragment的xml布局fragment_two.xml
5.7)第二个妹子Fragment的java类实现GirlTwoFragment.java
5.8)效果截图
(1)Fragment可通过getActivity()方法获取宿主Activity从而实现调用Activity和FragmentActivity类的
一些public类型方法,例如:findViewById()
(2)Activity与Fragment可以通过如下代码实例化Fragment并调用它的方法
6.2 接口实现
(1)定义一个通讯的Fragement类InterfaceContactFragment.java
(2)宿主活动对信息的接收实现MainActivity.java
6.3 Intent广播实现
(2)SecondActivity.java宿主或其他Activity注册广播接收者接收广播
注意:我们在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
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
- Android Layouts(Fragment)详解
- Android Layouts(GridLayout)详解
- Android UI(Layouts)-RelativeLayout详解
- Android UI(Layouts)-LinearLayout 详解
- Android UI(Layouts)-FrameLayout 详解
- Android UI(Layouts)-GridLayout 详解
- Android XML布局详解 - XML Layouts
- android layouts
- Android Layouts
- Android Multi-pane Layouts
- Custom Layouts on Android
- Android用户界面布局(layouts)
- android layouts之RelativeLayout
- Android Layouts概述
- Android API Guides---Layouts
- Android用户界面布局(layouts)
- Android Fragment使用详解
- Android Fragment使用详解
- 4. Median of Two Sorted Arrays
- 计算机中如何表示数字-04反码
- git命令汇总
- 工厂方法 Factory Method
- padding——图片文字的自适应布局
- Android Layouts(Fragment)详解
- 《剑指offer》合并两个有序的数组
- MYSQL不能连接了,错误ERROR 1129 (00000): Host ” is blocked because of many connection errors;
- 自定义View之onMeasure()
- Android .mk文件语法解析
- Linux下使用hydra获取linux和windows系统用户名和密码的教程
- C++11的bind,bind1st,bind2nd,function
- TCP/IP协议架构
- 还有太多的想看想学想准备