项目中使用fragment可以减轻activity的界面复杂度,与之带来的问题就是我们今天的博客内容,fragment给activity传递值.
实现的原理,fragment中定义回调接口,在合适的时候,被activity赋值,然后activity中实现回调接口,拿到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传值结束
// 无惊无险到了下班点..谢各位读者,欢迎拍砖!!!
}