您的位置:首页 > 其它

Activity与Fragment,以及Fragment与Fragment之间的数据通讯

2016-05-22 19:26 369 查看

Activity和Fragment无疑是Android开发中使用最多的组件,如果Activity使用了多个Fragment,需要在Activity与Fragment,以及Fragment与Fragment之间进行数据通讯,这是开发时经常遇到的需求问题,其实在我没整理这篇blog前也遇到过这样的数据通讯需求,下面是后来整理的用接口回调的方式实现Fragment与Fragment之间,以及用Bundler实现Activity与Fragment之间数据通讯,希望能对大家有帮助.

通过接口回调,实现Fragment与Fragment之间数据通讯,逻辑如下:

1.创建一个接口,并在接口里面创建用于处理回调的函数,函数上面声明一个参数,
参数的数据类型是Fragment之间通讯的数据类型
2.在一个Fragment中创建用于注册回调的函数,函数上面声明一个参数,参数的数据类型是接口的类型
3.在另外的一个Fragment中创建一个内部类,并且将内部类实现回调的接口并实现接口中的函数,
然后在外部类中通过第一个Fragment的类名直接调用第一个Fragment中用于注册回调的函数,
将自己内部类的对象作为参数传递
4.实现数据传递时,只要第一个Fragment调用接口中处理数据的函数,那另外一个Fragment就会收到传递的数据


————————–以 下 是 代 码————————–

Activity(左边和右边各显示一个Fragment):

public class MainActivity extends Activity {
private FragmentManager mManager;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

// 获取Fragment管理者
mManager= getFragmentManager();

// 默认左边边显示的Fragment
FragmentTransaction leftTr= mManager.beginTransaction();
LeftFragment leftFragment = new LeftFragment();
leftTr.replace(R.id.fl_left, leftFragment);
leftTr.commit();

// 默认右边显示的Fragment
FragmentTransaction rightTr = mManager.beginTransaction();
RightFragment rightFragment= new RightFragment();
rightTr.replace(R.id.fl_right, rightFragment);
rightTr.commit();
}
}


处理回调的接口:

public interface DataListener {
//处理数据的函数,接口的实现类必须实现此函数
void onData(String data);
}


左边的Fragment:

public class LeftFragment extends Fragment {
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState{
View inflate = inflater.inflate(R.layout.left_fragment, null);

//调用右边RightFragment的setOnDataListener函数注册接口回调
RightFragment.setOnDataListener(new OnDataListener());

return inflate;
}

//用于实现回调的类,实现的是处理回调的接口,并实现接口里面的函数
class OnDataListener implements DataListener{
//实现接口中处理数据的函数,只要右边的Fragment调用onData函数,这里就会收到传递的数据
public void onData(String data) {
Toast.makeText(getActivity(), "data="+data, 0).show();
}
}
}


右边的Fragment:

public class RightFragment extends Fragment {
private static DataListener mDataListener;
private EditText mEdData;
private Button mBtnPut;
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View inflate = inflater.inflate(R.layout.right_fragment, null);

mEdData = (EditText) inflate.findViewById(R.id.ed_data);
mBtnPut= (Button) inflate.findViewById(R.id.btn_put);

mBtnPut.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
String data = mEdData.getText().toString();
//调用接口中处理数据的函数,这里实际是多态的方式调用的是实现类的函数
mDataListener.onData(data);
}
});
return inflate;
}

//创建注册回调的函数
public static void setOnDataListener(DataListener dataListener){
//将参数赋值给接口类型的成员变量
mDataListener = dataListener;
}
}


以上是所有的代码,至于Activity与Fragment之间通讯,可以沿用上面的逻辑去实现.

但是还可以用另外一种方法,就是用官方提供的Bundler去实现Activity传递数据到Fragment,

————————–以 下 是 代 码————————–

Activity(传递数据):

public class MainActivity extends Activity {
private FragmentManager mManager;
private  Button mBtnPutData;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);

mBtnPutData = (Button) findViewById(R.id.btn_putData);

//默认显示的Fragment
mManager= getFragmentManager();
FragmentTransaction transaction = mManager.beginTransaction();
RightFragment fragment = new RightFragment();
transaction.replace(R.id.fl_content, fragment);
transaction.commit();

//向RightFragment传值
mBtnPutData.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
FragmentTransaction transaction = mManager.beginTransaction();
RightFragment fragment = new RightFragment();
//创建Bundle对象
Bundle bundle = new Bundle();
//向Bundle输入数据
bundle.putInt("data", 100);
//对fragment设置Bundle参数
fragment.setArguments(bundle);
transaction.replace(R.id.fl_content, fragment);
transaction.commit();
}
});
}
}


Fragment(接收数据)

public class RightFragment extends Fragment{
private EditText mEtData;
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
View  inflate = inflater.inflate(R.layout.right_fragment, container,false);
mEtData = (EditText) inflate.findViewById(R.id.et_data);
//获取Activity传递的Bundle对象
Bundle bundle = getArguments();
if(bundle != null){
//从bundle里面获取key为data的int类型数值
int data = bundle.getInt("data");
//将值设置到控件上
et_data.setText("data="+data);
}
return inflate;
}
}


————————–完 毕————————–
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: