Android_Fragment和activity传值(项目体现)

来源:互联网 发布:php 环境变量path 编辑:程序博客网 时间:2024/06/11 14:41

项目中使用fragment可以减轻activity的界面复杂度,与之带来的问题就是我们今天的博客内容,fragment给activity传递值.

  • 项目需求描述,fragment中两个editext需要在改变之后把自己的值传递给当前的activity

国际惯例先来GIF看效果
这里写图片描述
这里写图片描述

UI分析:
这里写图片描述

实现的原理,fragment中定义回调接口,在合适的时候,被activity赋值,然后activity中实现回调接口,拿到fragment中的值,是不是很简单!

  1. fragment中定义回调接口,代码片段如下
// 这里是fragment用来传值的interfacepublic interface OnGetFragmentValueListener {        void startAddChanged(String startAdd);        void targetAddChanged(String targetAdd);    }// 这里是fragment内部的成员变量,用来接受activity的赋值    private OnGetFragmentValueListener onGetFragmentValueListener;

2.刚才提到合适的时候,activity给我们的接口赋值,这个合适的时候就是fragment的onAttach方法,这里我们需要判断下activity传递的接口是不是我们需要的类型的

// 这就是合适的时候,判断如果activity传入的接口是我们定义的类型就赋值,否则抛出异常提示  @Override    public void onAttach(Activity activity) {        super.onAttach(activity);        if (activity instanceof OnGetFragmentValueListener) {            onGetFragmentValueListener = (OnGetFragmentValueListener) activity;        } else {            throw new IllegalStateException("Your activity must impl the callback");        }    }

3.我们的成员变量接口拿到了activity的赋值,接下来就是我们在需要的时候调用,刚才需求提到我们要拿到我们的出发地和目的地.
所以我们在两个ED控件变化之后,去调用接口

// ed 的textwatcher监听 大家都会的,在变化之后调用相对应的接口回调即可    public void afterTextChanged(Editable s) {            switch ((int) editText.getTag()) {                case ET_TAG._START:                    onGetFragmentValueListener.startAddChanged(s.toString());                    break;                case ET_TAG._TARGET:                    onGetFragmentValueListener.targetAddChanged(s.toString());                    break;            }        }

4.马上成功,看我们的activity界面如何接受
先让activity实现fragment中定义的传值接口,so easy..

public class RouteLineActivity extends BaseActivity implements RouteLineTabView, RouteLineLocationFragment.OnGetFragmentValueListener {   // 省略无关代码......// 这里实现fragment回调,拿到传递过来的值    @Override    public void startAddChanged(String startAdd) {        Logger.e("出发地:" + startAdd);        T.show(this, "fragment传出发地:" + startAdd, 0);    }    @Override    public void targetAddChanged(String targetAdd) {        Logger.e("目的地:" + targetAdd);        T.show(this, "fragment传目的地:" + targetAdd, 0);    }// 到此fragment给activity传值结束// 无惊无险到了下班点..谢各位读者,欢迎拍砖!!!}
2 0
原创粉丝点击