您的位置:首页 > 移动开发 > Android开发

Android 中Fragment与Activity通信大汇总

2016-03-31 23:02 381 查看
最近把跟小伙伴项目的一部分做完了,终于没借口偷懒了,今天就把Fragment与Activity之间通信做一个大汇总。

1、Activity与Fragment通信。

Activity向Fragemnt中传入数据时,通常将数据封装到一个Bundle对象中,通过
setArguments()
方法将对象传入启动的Fragment,在Fragment中,我们可以通过
getAragument()
方法获得bundle,解析出数据。

①封装bundle对象

Fragment1 = new Fragment1();
Bundle args = new Bundle();
args.putInt("id", 1);
Fragment1.setArguments(args);


②在Fragement中获取bundle

Bundle bundle = getArguments();
int id = bundle.getInt("id");


2、Fragment与宿主Activity通信

我们在Fragment中的onAttach声明一个接口,在宿主Activity中实现这个接口,当在Fragment中发生事件比如按钮点击事件,我们调用回调接口,宿主Activity就可以接收到该消息

①在Fragment中声明接口

public onCallBackListener onCallBackListener;
public interface onCallBackListener{
public void onCallBack();
}

@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
onCallBackListener = (onCallBackListener)activity;
}


②在Fragment事件中加入接口回调

btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onCallBackListener.onCallBack();
}
});


③在宿主Activity中声明该接口,并对回调做出相对的呼应

public class MainActivity extends FragmentActivity implements Fragment1.onCallBackListener{

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
********省略*********
}

@Override
public void onCallBack() {
Toast.makeText(this,"按下按钮",Toast.LENGTH_SHORT).show();
}
}


这样在Fragment中按下按钮,宿主Activity会显示一个Toast

3、Fragment获取宿主Activity的数据

如果我们Fragment想要获取宿主Activity的信息,只能获取到宿主Activity中public的对象和方法。

例如Activity中有两个对象

private int id = 1;
public int id1= 2;


还有两个方法

private int getId(){
}

public int getId1(){
}


在Fragment中我们可以通过
((MainActivity)getActivity())
方法来获取到宿主的活动实例,但是之后只能通过
((MainActivity)getActivity()).id1
得到id1对象。但是可以通过
getId1()
方法,间接获取到id的数值。

4、Fragment与Fragment之间通信

这种情况一般我们都选择宿主Activity作为中介,声明两个public方法

getxxx() setxxx()Fragement通过调用Activity中的这两个方法来互相通信。

Acitivity定义

public class Act extends Activity{
private Fragment f1=null;
private Fragment f2=null;
public interface MyCallBack{//定义回调接口
void callBack(String param);//回调方法
}
public void onCreate(Bundle bd){
super.onCreate(bd);
f1 = (Fragment)findViewById(R.id.xxxx1);//获取fragment1
f2 = (Fragment)findViewById(R.id.xxxx2);//获取fragment2
f1.setCallBack(new MyCallBack(){//往fragment1中设置回调接口,便于传递参数到activity中
public void callBack(String param){
f2.showParam(param);//回调接口中,把参数传递到fragment2中
}
});
}
}


Fragment1定义

public class MyFrag1 extends Fragment {
MyCallBack cb=null;
public void setCallBack(MyCallBack cb){//设置回调接口
this.cb = cb;
}
public void postParam(){
this.cb.callBack("2222");//调用回调接口
}
}


Fragment2定义

public class MyFrag2 extends Fragment {
public void showParam(String params){//显示输入的值
...显示params
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: