Android 定义接口通知之Activity中刷新Fragment数据
在一个Activity中总会有那么几个Fragment吧,Activity作为宿主,也会时常与其内部的Fragment谈谈心事,这就有了相遇相知,有一天Fragment想Activity了,想告诉她一件心事,此时Fragment要去通知Activity的一个状态按钮,通过改变这个状态按钮来提示Activity自己有心事想和她诉说,那么,一起来帮Fragment去行动吧:
1.定义一个监听管理者:
import com.desinpro.spauto.itf.IListener;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 用观察者模式代替广播通知刷新界面,类似广播、EventBus、服务等通知
* @author sgf
*
*/
public class ListenerManager
{
/**
* 单例模式
*/
public static ListenerManager listenerManager;
/**
* 注册的接口集合,发送广播的时候都能收到
*/
private List<IListener> iListenerList = new CopyOnWriteArrayList<IListener>();
/**
* 获得单例对象
*/
public static ListenerManager getInstance()
{
if(listenerManager == null)
{
listenerManager = new ListenerManager();
}
return listenerManager;
}
/**
* 注册监听
*/
public void registerListtener(IListener iListener)
{
iListenerList.add(iListener);
}
/**
* 注销监听
*/
public void unRegisterListener(IListener iListener)
{
if(iListenerList.contains(iListener))
{
iListenerList.remove(iListener);
}
}
/**
* 发送广播
*/
public void sendBroadCast(int flag, String str, String message)
{
for (IListener iListener : iListenerList)
{
iListener.notifyAllActivity(flag, str, message);
}
}
}
2.在Fragment中向宿主Activity发送消息意图并传入相关参数:
// 回调传递点击的view
ListenerManager.getInstance().sendBroadCast(ConstUtils.MAIN_STATUS_FLAG,ConstUtils.MAIN_STATUS_ZERO, (String) msg);
3.定义发送广播接口:
/**
* 发送广播接口
*
* @author sgf
* @version
* @see [相关类/方法]
* @since [产品/模块版本]
*/
public interface IListener {
void notifyAllActivity(int flag, String str, String message);
}
4.在Activity中实现接口并生成方法(被通知刷新的一方):
public class MainActivity extends BaseActivity implements IListener {
........
//太多的接口,太多的理由,为了你......
}
切记!一定要先注册,和广播、服务、EventBus原理类似
//注册自定义接口的监听器
ListenerManager.getInstance().registerListtener(this);
在方法中做自己的标识和对应的逻辑处理:
/**
* 接受广播的意图来做某事
*/
@Override
public void notifyAllActivity(final int flag, final String str, final String message) {
this.runOnUiThread(new Runnable() {
@Override
public void run() {
if(flag == ConstUtils.MAIN_STATUS_FLAG){
if (!TextUtils.isEmpty(str)) {
if (str.equals(ConstUtils.MAIN_STATUS_ZERO)) {
toPrepareState();
} else if (str.equals(ConstUtils.MAIN_STATUS_TWO)) {
toStartState();
} else if (str.equals(ConstUtils.MAIN_STATUS_THREE)) {
toStopState();
if (message != null) {
showErrorDialog((String) message);
}
}
}
}else if(flag == ConstUtils.MAIN_STATUS_EMERGENCY_STOP){
llTopReset.setVisibility(View.GONE);
llTopUrgency.setVisibility(View.VISIBLE);
}
}
});
最后记得要关闭注销监听~