Activity和Fragment进行通信的3种方式

------------------------------------------------Activity发消息给Fragment-----------------------------------------------

MainActivity

package com.example.handlerway;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
	private Handler mHandler;
	private EditText edit;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		edit = (EditText) findViewById(R.id.edit);
	}

	/**
	 * 我们需要在Activity中定义一个方法用来设置Handler对象。
	 */
	public void setHandler(Handler handler) {
		mHandler = handler;
	}

	public void button(View view) {
		HandlerFragment arg = new HandlerFragment();
		FragmentManager fragmentManager = getFragmentManager();
		FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction();
		fragmentTransaction.replace(R.id.layout_fragment, arg);
		fragmentTransaction.commit();
	}

	/**
	 * 然后我们可以在Activity中发送消息给Fragment中的Hanlder进行交互。
	 */
	public void inter(View view) {
		Message msg = new Message();
		msg.obj = edit.getText().toString();
		msg.what = 1;
		//发送消息
		mHandler.sendMessage(msg);
	}
}

HandlerFragment

package com.example.handlerway;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

public class HandlerFragment extends Fragment {

	private TextView text;
	private MainActivity mActivity;

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_handler, container, false);
		text = (TextView) view.findViewById(R.id.text);

		return view;
	}

	public Handler mHandler = new Handler() {
		public void handleMessage(android.os.Message msg) {
			switch (msg.what) {
			case 1:
				text.setText((String) msg.obj);
				break;
			}
		};
	};

	/**
	 * 在Fragment中的回调函数onAttach()中得到Fragment所在Activity,并调用setHandler方法,设置Handler。
	 * 该Handler在Fragment中定义,用来接收消息与Fragment进行交互。
	 */
	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		mActivity = (MainActivity) activity;
		mActivity.setHandler(mHandler);
	}
}

activity_main.xml

<LinearLayout 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:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp" >

    <FrameLayout

        android:id="@+id/layout_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >
    </FrameLayout>

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请先添加点击添加Fragment,并输入你要传递的消息"
        android:lines="5"
        android:padding="5dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="button"
        android:padding="10dp"
        android:text="这个按钮是添加一个Fragment" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="inter"
        android:padding="10dp"
        android:text="这个按钮是发送一个消息给Fragment" />

</LinearLayout>

fragment_handler.xml

<LinearLayout 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:background="#F4A460"
    android:gravity="center"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:gravity="center"
        android:padding="10dp"
        android:textSize="20dp" />

</LinearLayout>

------------------------------------------------Fragment发消息给Activity-----------------------------------------------

MainActivity

package com.example.handlerway;

import android.app.Activity;
import android.app.FragmentManager;
import android.app.FragmentTransaction;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;

public class MainActivity extends Activity {
	private Handler mainActivityHandler = new Handler() {
		public void handleMessage(Message msg) {
			switch (msg.what) {
			case 1:
				edit.setText((CharSequence) msg.obj);
				break;

			default:
				break;
			}
		};
	};
	private EditText edit;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		edit = (EditText) findViewById(R.id.edit);
	}

	public void button(View view) {
		HandlerFragment arg = new HandlerFragment(mainActivityHandler);
		FragmentManager fm = getFragmentManager();
		FragmentTransaction ft = fm.beginTransaction();

		ft.replace(R.id.layout_fragment, arg);
		Bundle args = new Bundle();
		args.putString("bbb", "aaa");
		arg.setArguments(args);
		ft.commit();
	}

}

HandlerFragment

package com.example.handlerway;

import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class HandlerFragment extends Fragment implements OnClickListener {

	private TextView text;
	private MainActivity mActivity;

	private EditText editText;
	private Button button;
	// 接受handler
	private Handler fragmentHandler = new Handler();

	public HandlerFragment(Handler mainActivityHandler) {
		super();
		this.fragmentHandler = mainActivityHandler;
	}

	@Override
	public View onCreateView(LayoutInflater inflater, ViewGroup container,
			Bundle savedInstanceState) {
		View view = inflater.inflate(R.layout.fragment_handler, container,
				false);
		text = (TextView) view.findViewById(R.id.text);
		editText = (EditText) view.findViewById(R.id.editText);
		button = (Button) view.findViewById(R.id.button);

		button.setOnClickListener(this);

		if (getArguments().getString("bbb").equals("aaa")) {
			editText.setText("尼玛");
		}

		return view;
	}

	@Override
	public void onAttach(Activity activity) {
		super.onAttach(activity);
		mActivity = (MainActivity) activity;
	}

	@Override
	public void onClick(View v) {
		if (v.getId() == R.id.button) {
			// 发送消息给activity
			Message msg = new Message();
			msg.obj = editText.getText().toString();
			msg.what = 1;
			fragmentHandler.sendMessage(msg);
		}
	}
}

activity_main.xml

<LinearLayout 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:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp" >

    <FrameLayout
        android:id="@+id/layout_fragment"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_weight="1" >
    </FrameLayout>

    <EditText
        android:id="@+id/edit"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请先添加点击添加Fragment,并输入你要传递的消息"
        android:lines="5"
        android:padding="5dp" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:onClick="button"
        android:padding="10dp"
        android:text="Click to add a fragment" />

</LinearLayout>

fragment_handler.xml

<LinearLayout 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:gravity="center_horizontal"
    android:orientation="vertical"
    android:padding="10dp" >

    <TextView
        android:id="@+id/text"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="10dp" />

    <EditText
        android:id="@+id/editText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:ems="10" >

    </EditText>

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button" />

</LinearLayout>

----------------------------第4种方式  接口方式,下篇博客在更,下班回家着急----------------------------------------

时间: 2024-12-28 15:20:16

Activity和Fragment进行通信的3种方式的相关文章

Activity 和Fragment 的通信

 Activity 和 Fragment 通信 Activity 给 Fragment 传递信息 接口通信,Intent 通信,还有直接调用他的方法(后两者只适合刚进去就接受数据,而接口还可以通过某种情况来回调)广播传输 Fragment 给 Activity 传递信息 接口传输  广播传输 下面就给个实例来看一下 第一个Fragment:  Activity向Fragment 通信是Intent 通信,Fragment向Activity传输是接口通信. 这个是Activity中的代码. 先得到

分布式通信的几种方式

RPC(remote produce calL) RPC是远程过程调用协议,它是基于C/S模型调用的机制,客户机向服务器端发 送调用请求等待服务器应答,是一种典型的请求应答机制,大致过程可以理解为本地分布式对象向本机发请求,不用自己编写底层通信本机会通过网络向服务器发送 请求,服务器对象接受参数后,经过处理再把处理后的结果发送回客户端. 它是早期的支持分布式一些,缺点rpc是面向过程的远程调用,不支持面向对象,所以现在用的人就少了. 不支持异步调用 RMI(remote method invoc

React组件通信的几种方式

需要组件之进行通信的几种情况? 父组件向子组件通信?? 子组件向父组件通信?? 跨级组件通信?? 没有嵌套关系组件之间的通信? 1. 父组件向子组件通信React数据流动是单向的,父组件向子组件通信也是最常见的;父组件通过props向子组件传递需要的信息?Child.jsximport?React?from?'react';import?PropTypes?from?'prop-types';export?default?function?Child({?name?})?{????return?

IPC进程之间通信的几种方式

概念 进程间通信就是在不同进程之间传播或交换信息,那么不同进程之间存在着什么双方都可以访问的介质呢?进程的用户空间是互相独立的,一般而言是不能互相访问的,唯一的例外是 共享内存区 .但是,系统空间却是“公共场所”,所以内核显然可以提供这样的条件. 除此以外,那就是双方都可以访问的 外设 了.在这个意义上,两个进程当然也可以通过磁盘上的普通文件交换信息,或者通过“注册表”或其它数据库中的某些表项和记录交换信息.广义上这也是进程间通信的手段,但是一般都不把这算作“进程间通信”.因为那些通信手段的效率

进程间通信和线程间通信的几种方式

进程间通信和线程间通信的几种方式 进程和线程的区别 概念 对于进程来说,子进程是父进程的复制品,从父进程那里获得父进程的数据空间,堆和栈的复制品. 而线程,相对于进程而言,是一个更加接近于执行体的概念,可以和同进程的其他线程之间直接共享数据,而且拥有自己的栈空间,拥有独立序列. 共同点 它们都能提高程序的并发度,提高程序运行效率和响应时间.线程和进程在使用上各有优缺点. 线程执行开销比较小,但不利于资源的管理和保护,而进程相反.同时,线程适合在SMP机器上运行,而进程可以跨机器迁移. 不同点 多

Android Service与Activity之间通信的几种方式

在Android中,Activity主要负责前台页面的展示,Service主要负责需要长期运行的任务,所以在我们实际开发中,就会常常遇到Activity与Service之间的通信,我们一般在Activity中启动后台Service,通过Intent来启动,Intent中我们可以传递数据给Service,而当我们Service执行某些操作之后想要更新UI线程,我们应该怎么做呢?接下来我就介绍两种方式来实现Service与Activity之间的通信问题 通过Binder对象 当Activity通过调

*Android跨进程通信的四种方式

由于android系统中应用程序之间不能共享内存.因此,在不同应用程序之间交互数据(跨进程通讯)就稍微麻烦一些.在android SDK中提供了4种用于跨进程通讯的方式.这4种方式正好对应于android系统中4种应用程序组件:Activity.Content Provider.Broadcast和Service.其中Activity可以跨进程调用其他应用程序的Activity:Content Provider可以跨进程访问其他应用程序中的数据(以Cursor对象形式返回),当然,也可以对其他应

容器间通信的三种方式 - 每天5分钟玩转 Docker 容器技术(35)

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信. IP 通信 从上一节的例子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡. 满足这个条件后,容器就可以通过 IP 交互了.具体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络.可参考上一节 httpd 和 busybox 的例子,这里不再赘述. Docker DNS Server 通过 I

不同VLAN之间相互通信的两种方式

(单臂路由.三层交换) 试验环境:东郊二楼第三机房 试验设备:Catalyst 2950-24(SW3) Cisco 2611(R2) Catalyst 3750 SERIES (带两个SD接口,S8----SW-2L) 真机(PC5.PC6). 试验目的: 1.通过单臂路由实现不同VLAN之间的通信 2.通过三层交换路由功能实现不同VLAN之间的通信 网络拓扑图: 1.单臂路由实现不同VLAN互通试验网络拓扑图 2.三层交换实现不同VLAN互通实验网络拓扑图 实验步骤: 单臂路由实现不同VLA