不会用handler。找了几个文章学习大多数都是写的activity向fragment发送消息的例子,终于找到一个fragment向activity发送消息的,粘过来学习一下。
原文:http://blog.csdn.net/xiaoyuan511/article/details/38013277
转自:http://www.tuicool.com/articles/f6biyuZ
大家好.Fragment现在越来越广泛了,中文翻译为碎片,下面我就就碎片代替了,当时谷歌出碎片的原因是因为Android设备屏幕大小不统一,碎片出来了.用一套APP就可以解决平板跟手机上的UI问题.对于新手让碎片跟Activity交互很困难,因为碎片是依附在Activity上面的,他们不是一个整体,好,废话少说,让我们看看到底如何让碎片跟Activity交互.
我是这样的设计的,在Activity里面一个Button,点击这个Button让下面的碎片显示一段文件,当这段文字显示出来以后碎片里面也有个Button,点击碎片里面的这个Button让Activity换个碎片.
首先我先在Activity定义接口和一个Handler,接口的作用是让碎片接收Activity的指令,而Handler用于接收碎片传来的指令,Activity在执行操作.如下所示:
package com.example.fragmentactivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.app.Activity;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentTransaction;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.FrameLayout;
public class MainActivity extends FragmentActivity implements OnClickListener {
private Button button1;
private String fragmentName;
private OnButtonClickedListener buttonClickedListener;
/**
* 定义一个Handler用于接收黄色碎片给Activity发出来的指令
*/
public Handler handler=new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if(msg!=null){
switch (msg.what) {
case 100:
/**
* 接收到黄色碎片发来的指令,Activity执行替换操作
*/
fragmentName=Fragment2.class.getName();
replaceFragment(R.id.FrameLayout1, fragmentName);
break;
default:
break;
}
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
button1=(Button) findViewById(R.id.button1);
button1.setOnClickListener(this);
/**
* 加载黄色碎片
*/
fragmentName=Fragment1.class.getName();
replaceFragment(R.id.FrameLayout1, fragmentName);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button1:
if(buttonClickedListener!=null){
buttonClickedListener.onclicked("Activity:我不想要这个黄色碎片了,点击下面的按钮给我换个绿色的碎片");
}
break;
default:
break;
}
}
/*
*
* 加载碎片
*/
protected void replaceFragment(int viewResource, String fragmentName) {
FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
Fragment fragment = Fragment.instantiate(this, fragmentName);
ft.replace(viewResource, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
ft.commit();
getSupportFragmentManager().executePendingTransactions();
}
/**
* 定义一个接口
* @author zqy
*
*/
public interface OnButtonClickedListener{
/**
* 里面传个值
* @param s
*/
public void onclicked(String s);
}
/**
*
* @param buttonClickedListener
* 写一个对外公开的方法
*/
public void setButtonClickedListener(OnButtonClickedListener buttonClickedListener){
this.buttonClickedListener=buttonClickedListener;
}
}
这就是Activity里面的代码,我们在去写两个碎片如下所示:
Fragment1:
package com.example.fragmentactivity;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;
import com.example.fragmentactivity.MainActivity.OnButtonClickedListener;
public class Fragment1 extends Fragment implements OnClickListener {
private TextView textView;
private Button button;
private Handler handler;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
MainActivity activity=(MainActivity) getActivity();
/**
* 得到Activity的Handler
*/
handler=activity.handler;
/**
* 加监听
*/
activity.setButtonClickedListener(new OnButtonClickedListener() {
@Override
public void onclicked(String s) {
/*
* 显示Activity传来的内容
*/
textView.setText(s);
button.setVisibility(View.VISIBLE);
}
});
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.item1, null);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
textView=(TextView) getActivity().findViewById(R.id.textView1);
button=(Button) getActivity().findViewById(R.id.button2);
button.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.button2:
/**
* 发送指令到Activity
*/
handler.sendEmptyMessage(100);
break;
default:
break;
}
}
这个碎片让它的Activity实现这个接口,在把接口里面的值显示到页面上,在点击这个碎片里面的Button给它的Activity发送一个消息.这里面我发的是100.
Fragment2:
package com.example.fragmentactivity;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
public class Fragment2 extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// TODO Auto-generated method stub
return inflater.inflate(R.layout.item2, null);
}
}
这就写完了.以后的项目在也不怕碎片跟Activity通信了,下面来一张效果图,UI比较难看,哈哈,不会的可以在下面留言,我会把Demo给你们传到资源上,供你们下载,谢谢!
源码下载:http://download.csdn.net/detail/u011310942/7658949
Handler造成Activity泄漏,用弱引用真的有用么?
另外:http://blog.csdn.net/u013356254/article/details/52463636
发现只要handler声明称static的就不会造成内存泄漏,而且回收很快
----------------------------------------------------分割线---------------------------------------------------------------
Activity与Fragment通过Handler交互
http://blog.csdn.net/as4399/article/details/54799103
这篇文章也很好 ,但是只有activity向fragment传值
----------------------------------------------------分割线---------------------------------------------------------------
http://blog.csdn.net/ucxiii/article/details/52090440
Fragment与Activity交互有很多种实现方式。其中一种常用方法是通过Handler消息处理实现。
那么在谁的类中实现Handler呢?
大致来讲就是:
谁想被控制,就在谁的类中实现Handler。在另一方中得到这个Handler对象,来实现单向交互。
例如很典型的应用场景:
Activity需要响应返回键事件,并改变Fragment中状态。那么Fragment就是被控对象,
需要在Fragment中实现Handler来接受Avtivity的控制。
如果Fragment中控件响应事件后,需要改变Activity状态,就需要反过来实现。
当然通过Handler也可以实现双向的交互,两方同时实现Handler,并提供给对方就可以了: