Android_Fragment和activity传值(项目体现)

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

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

国际惯例先来GIF看效果
Android_Fragment和activity传值(项目体现)_第1张图片
Android_Fragment和activity传值(项目体现)_第2张图片

UI分析:
Android_Fragment和activity传值(项目体现)_第3张图片

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

  1. fragment中定义回调接口,代码片段如下
// 这里是fragment用来传值的interface
public 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传值结束

// 无惊无险到了下班点..谢各位读者,欢迎拍砖!!!

}

你可能感兴趣的:(Android系列)