前言
Fragment是android开发中常用的一个控件,我们可以在Fragment内部进行不同的控件之间的通信,如点击了一个按钮就可以在一个TextView上显示一个数据,因为Button和TextView都是在Fragment内部,能够得到它们的对象,所以我们当然可以进行通信,那么,点击Fragment内部的按钮能够在Activity中的TextView上显示吗?我们在Fragment内部没法直接得到Activity中的对象,所以本文就是教大家如何在Fragment和Activity之间进行通信。
实现
Fragment和Activity之间的通信就是把Fragment的数据传到Activity中,当然我们可以使用静态变量,在Fragment内部就可以使用Activity中静态变量,当然也就可以把数据传输了过去,但是,这种方法太low了,绝对会被别人说没水平,而且代码之间的耦合性太高,是我们所不欢迎的,那么我们就要使用另一种方法 – 接口。
接口是java中的语法,以前不太明白接口的使用,但是真正使用了接口时候才会明白接口的好处,本文就是利用接口实现通信的。
我们先来看一下效果图:
可以看到,图中灰色的是一个Fragment,里面有两个按钮和一个TextView,点击按钮之后,在Activity中显示按钮的文字,我们需要做的就是在Fragment和Activity中简历联系,把按钮的文字传递过去。
这里我们定义一个接口:IFragmentListener
public interface IFragmentListener {
void onFragmentClick(View v);
}
在接口里面有一个方法,传入的参数是一个View对象,这个View对象就是被点击的控件的对象,传入之后在Activity中得到这个对象就可以得到被点击控件的信息了。
下面是Fragment的代码:
public class MyFragment extends Fragment implements OnClickListener{
private Button btn_java,btn_c;
private IFragmentListener mListener;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View v = inflater.inflate(R.layout.v_fragment, container,false);
initView(v);
return v;
}
private void initView(View v) {
btn_c = (Button) v.findViewById(R.id.btn_c);
btn_java = (Button) v.findViewById(R.id.btn_java);
btn_c.setOnClickListener(this);
btn_java.setOnClickListener(this);
}
/**
* Fragment和Activity绑定起来
*/
@Override
public void onAttach(Activity activity){
super.onAttach(activity);
mListener = (IFragmentListener) activity;
}
@Override
public void onClick(View v) {
mListener.onFragmentClick(v);
}
}
在MyFragment里面我们定义了IFragmentListener的对象,然后在onAttach中给mListener赋值。那么,问题来了,onAttach是什么方法,有什么用?
关于这个问题就必须要牵扯到Fragment的生命周期了,类似Activity的生命周期,但是本文不打算在这里深入讲解它,只会告诉你onAttach方法的作用。onAttch方法是Fragment生命周期中的一个方法,它的作用就是把Fragment所依附的Activity的对象传入到Fragment中,也就是说我们在Fragment中可以得到Activity的对象。那么我们拿到Activity的对象有什么用呢?还是先来看看MainAcitivity的代码吧:
public class MainActivity extends Activity implements IFragmentListener{
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
@Override
public void onFragmentClick(View v){
String data = ((Button)v).getText().toString();
((TextView)findViewById(R.id.text)).setText(data);
}
}
可以看到原来我们的MainActivity继承了IFragmentListener接口,即继承onFragmentClick方法,在MyFragment的onAttach方法里面传入的继承了IFragmentListener接口的MainAcitivty对象,当mListener对象的onFragmentClick方法被调用的时候执行的就是MainAcitivyt中的方法,也就是View对象被传入到了Activity中,我们就可以在Activity中得到了被点击的Fragment中的控件对象然后进行我们想要的操作。
小结
接口的使用可以降低Fragment和Activity中的耦合性,如果在Fragment中使用Activity中的静态变量,那么这个Fragment只能与当前Activity进行绑定,就不能和其他的Activity进行绑定了,这样就不能做到Fragment的通用性,在开发中尽量避免这样的问题,不断的去优化自己的代码,降低耦合才是我们的目标。