【Android开发】之Fragment与Acitvity通信

  上一篇我们讲到与Fragment有关的经常使用函数,既然Fragment被称为是“小Activity”。如今我们来讲一下Fragment怎样与Acitivity通信。假设上一篇还有不懂得。能够再看一下。

传送门

  Fragment与Activity通信的方式例如以下:

  一、通过初始化函数提供

    1.在动态加入Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据。

     2.在Fragment中,在onAttach()函数中通过调用getArguments()获得一个Bundle对象,从而获取我们提供的数据。

  二、创建回调接口

    比方说:新闻浏览情境下,共同拥有两个Fragment。一个是用来显示新闻标题;另外一个用来显示新闻内容。

当我们点击新闻标题的时候,新闻的内容就显示到另外一个Fragment其中了。

以下我们就来通过按下Fragment1中的button来传递一个消息到Fragment2中。

    首先我们要做的是,在Fragment1中创建一个回调接口,而且在Activity中重写他的方法,传递信息给Fragment2(举一反三:我们也能够传递给其它的Fragment)。

    以下我给出Fragment1的代码:

package com.example.fragment;

import android.app.Activity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;

import com.example.fragmentdemo.R;

public class Fragment1 extends Fragment {

	private static final String TAG = "FragmentDemo";
	private OnButtonClickListener mListener;

	/**
	 * 这里我们创建一个回调接口
	 *
	 * @author Myp
	 *
	 */
	public interface OnButtonClickListener {
		public void onButtonClicked();
	}

	@Override
	public void onAttach(Activity activity) {
		Log.v(TAG, "Fragment1 onAttach");
		Bundle args = getArguments();
		if (null != args) {
			/*
			 * 在这里我们能够将从Acivity收到的数据保存起来,而且显示到Fragment其中。
			 */
			Log.d(TAG,
					"Fragment1 Get data from activity "
							+ args.getString("hello"));
		}

		try {
			mListener = (OnButtonClickListener) activity;
		} catch (ClassCastException e) {
			throw new ClassCastException(activity.toString()
					+ " must implement OnButtonClickListener");
		}
		super.onAttach(activity);
	}

	@Override
	public void onInflate(Activity activity, AttributeSet attrs,
			Bundle savedInstanceState) {
		Log.d(TAG, "onInflate");
		super.onInflate(activity, attrs, savedInstanceState);
	}

	@Override
	public void onCreate(Bundle savedInstanceState) {
		Log.v(TAG, "Fragment1 onCreate");
		super.onCreate(savedInstanceState);
	}

	@Override
	public void onDestroy() {
		Log.v(TAG, "Fragment1 onDestroy");
		super.onDestroy();
	}

	@Override
	public void onResume() {
		Log.v(TAG, "Fragment1 onResume");
		super.onResume();
	}

	@Override
	public void onStart() {
		Log.v(TAG, "Fragment1 onStart");
		super.onStart();
	}

	@Override
	public void onDetach() {
		Log.v(TAG, "Fragment1 onDetach");
		super.onDetach();
	}

	@Override
	public void onPause() {
		Log.v(TAG, "Fragment1 onPause");
		super.onPause();
	}

	@Override
	public void onStop() {
		Log.v(TAG, "Fragment1 onStop");
		super.onStop();
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		Log.v(TAG, "Fragment1 onCreateView");
		View view = inflater.inflate(R.layout.fragment1, container, false);
		// 为button注冊事件,而且调用回调接口,将信息返回给上层
		view.findViewById(R.id.fragment1_btn).setOnClickListener(
				new OnClickListener() {
					@Override
					public void onClick(View v) {
						mListener.onButtonClicked();
					}
				});
		return view;
	}

	@Override
	public void onDestroyView() {
		Log.v(TAG, "Fragment1 onDestroyView");
		super.onDestroyView();
	}

	@Override
	public void onActivityCreated(Bundle savedInstanceState) {
		Log.v(TAG, "Fragment1 onActivityCreated");
		super.onActivityCreated(savedInstanceState);
	}

}

    1.创建回调接口。

    2.为了确保宿主activity实现这个接口,fragment1的onAttach() 方法中通过将传入的activity强制类型转换,实例化一个OnButtonClickListener对象;

    3.注冊Button的Click事件,并在事件中调用回调方法。

    然后我给出Activity的代码:

package com.example.fragmentdemo;

import android.annotation.SuppressLint;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.util.Log;
import android.widget.TextView;

import com.example.fragment.Fragment1;
import com.example.fragment.Fragment1.OnButtonClickListener;
import com.example.fragment.Fragment2;

@SuppressLint("Recycle")
public class MainActivity extends FragmentActivity implements
		OnButtonClickListener {

	private static final String TAG = "FragmentDemo";
	private Fragment1 fragment1;
	private Fragment2 fragment2;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		Log.i(TAG, "onCreate");
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		fragment1 = new Fragment1();
		fragment2 = new Fragment2();
		addFragment1();
		addFragment2();
	}

	private void addFragment1() {
		Bundle args = new Bundle();
		args.putString("hello", "Hello Fragment1");
		fragment1.setArguments(args);
		Log.i(TAG, "create Fragment1");
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();
		transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		transaction.add(R.id.one, fragment1);
		transaction.addToBackStack(null);
		transaction.commit();
	}

	private void addFragment2() {
		Bundle args = new Bundle();
		args.putString("hello", "Hello Fragment2");
		fragment2.setArguments(args);
		Log.i(TAG, "create Fragment2");
		FragmentTransaction transaction = getSupportFragmentManager()
				.beginTransaction();
		transaction.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
		transaction.replace(R.id.two, fragment2);
		transaction.addToBackStack(null);
		transaction.commit();
	}

	@Override
	public void onAttachFragment(Fragment fragment) {
		Log.i(TAG, "onAttachFragment");
		super.onAttachFragment(fragment);
	}

	@Override
	protected void onDestroy() {
		Log.i(TAG, "onDestroy");
		super.onDestroy();
	}

	@Override
	protected void onPause() {
		Log.i(TAG, "onPause");
		super.onPause();
	}

	@Override
	protected void onResume() {
		Log.i(TAG, "onResume");
		super.onResume();
	}

	@Override
	protected void onStart() {
		Log.i(TAG, "onStart");
		super.onStart();
	}

	@Override
	protected void onStop() {
		Log.i(TAG, "onStop");
		super.onStop();
	}

	@Override
	protected void onRestart() {
		Log.i(TAG, "onRestart");
		super.onRestart();
	}

	@Override
	public void onButtonClicked() {
		Log.i(TAG, "onButtonClicked");
		TextView tv = (TextView) fragment1.getActivity().findViewById(
				R.id.fragment2_tv);
		tv.setText(tv.getText() + "\n从Fragment1收到数据!

");
	}
}

    1.通过implements实现回调接口。

    2.重写回调方法,然后向Fragment2传递数据。

  三、源代码下载

    点我下载。下载源代码导入project就能够使用了!

  接下来可能会介绍一下Fragment的动画效果。有兴趣的能够关注一下。

时间: 2024-08-16 17:53:40

【Android开发】之Fragment与Acitvity通信的相关文章

Android 开发 之 Fragment 详解

作者 : 韩曙亮 转载请著名出处 : http://blog.csdn.net/shulianghan/article/details/38064191 1. Fragement 概述 Fragement 与 Activity 生命周期关系 : Fragement 嵌入到 Activity 组件中才可以使用, 其生命周期与 Activity 生命周期相关. -- stop 与 destroy 状态 : Activity 暂停 或者 销毁的时候, 其内部嵌入的所有的 Fragement 也会执行

Android开发:碎片Fragment完全解析fragment_main.xml/activity_main.xml

Android开发:碎片Fragment完全解析 为了让界面可以在平板上更好地展示,Android在3.0版本引入了Fragment(碎片)功能,它非常类似于Activity,可以像 Activity一样包含布局.Fragment通常是嵌套在Activity中使用的,现在想象这种场景:有两个 Fragment,Fragment 1包含了一个ListView,每行显示一本书的标题.Fragment 2包含了TextView和 ImageView,来显示书的详细内容和图片. AD:51CTO学院:I

Android开发 碎片Fragment的API全解与标准使用

前言 我还在学习Android开发的时候发过一篇简单的入门Fragment demo代码:https://www.cnblogs.com/guanxinjing/p/9708626.html 但是,Fragment远远不是一个简单的Demo就能了解清楚的,所以此篇博客将讲解FragmentManage的Api的功能 如何获取FragmentManage activity里获取FragmentManage方式如下: @Override protected void onCreate(Bundle

Fragment与Acitvity通信

Fragment与Activity通信的方式如下: 一.通过初始化函数提供 1.在动态添加Fragment的过程中,我们在Activity中通过Fragment.setArguments()的方法为Fragment提供数据: 2.在Fragment中,在onAttach()函数中通过调用getArguments()获得一个Bundle对象,从而获取我们提供的数据. 二.创建回调接口 比如说:新闻浏览情境下,共有两个Fragment,一个是用来显示新闻标题:另外一个用来显示新闻内容.当我们点击新闻

android开发(41) Fragment中使用POP_BACK_STACK_INCLUSIVE达到一次跳转到栈底。类似Activity的 采用FLAG_ACTIVITY_CLEAR_TOP

需求场景: 在开发中遇到下面这样场景: 1.创建 Fragment A 显示.  这时栈的结构是: 1.Fragment A 2.创建 Fragment B 并 显示.  从下到上看,这时栈的结构是: 2.Fragment B 1.Fragment A 3.创建 Fragment C 并 显示.  从下到上看,这时栈的结构是: 3.Fragment C 2.Fragment B 1.Fragment A 那么,如何从 Fragment C 一次性跳到 Fragment A 呢? 实现: 入栈时,

android开发(35) fragment和actionbar组合使用。解决不触发onOptionsItemSelected的问题,获得actionbar 的默认 get icon

先说说我的使用场景: 我写了一个activity,使用了actionbar. 在这个activity中,有fragment,默认先打开一个 homeFragment,点击某个按钮会进入 detailFragment. 当启动detailFragment 时,问题出现了: 我希望在detailFragment 打开时,actionbar出现 返回的箭头  "<" . 于是我在onStart中写下: @Override public void onStart() { super.on

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 开发知识小集

XML文件 xml其实是一个博大精深的东西呐.. 这里我就简单写一点,慢慢加: 关于color.xml,转载自:http://blog.sina.com.cn/s/blog_4e60b09d01015jcp.html <?xml version="1.0" encoding="utf-8" ?> <resources> <color name="white">#FFFFFF</color><!

Android开发——Fragment的简单使用总结

前言: 之前搞项目的时候,就使用了这个Fragment,中间遇到了许多坑,把坑都解决了,现在写一篇较为简单的Fragment使用总结 Fragment的简单介绍: 简单来说,Fragment其实可以理解为一个具有自己生命周期的控件,只不过这个控件又有点特殊,它有自己的处理输入事件的能力,有自己的生命周期,又必须依赖于Activity,能互相通信和托管. 使用Fragment可以精简Activity文件的代码,便于更好的阅读,同时,有着更好的速度加载 使用Fragment的另外一种情况是可以在平板