数据的传递是APP应用开发中一个很常见和关键的工作,这边主要是梳理了一些常见的数据传递方式
Activity 和Activity之间传递数据
Intent intent = new Intent(this,MainListActivity.class);
// 可直接调用putXxx()方法 或 创建Bundle对象,完成参数传递
intent.putString(TAG,"data");
intent.putExtra(TAG,0);
startActivity(intent);
//如果需要页面的返回值
//startActivity(intent,requestCode);
//然后在OnActivityResult里面接收返回值
- 在最新的 Activity 1.2.0-alpha02 和 Fragment 1.3.0-alpha02 中,Google 提供了新的 Activity Result API, 让我们可以更加优雅的处理 onActivityResult。
具体可以参考 onActivityResult新API - 以前为了简化 onActivityResult,还可以使用一个 空页面的Fragment来处理承接这部分逻辑。这样只需要调用类似这样的方法就能收到数据
ActivityHelper.startActivityForResult(this, intent, requestCode, new OnResultCallback() {
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
if (resultCode == RESULT_OK) {
Toast.makeText(MainActivity.this, "收到数据", Toast.LENGTH_SHORT).show();
}
}
});
- 原理可以看这里: 更优雅的使用startActivityForResult及权限请求。
理论上很多异步的响应都可以使用这种方式处理
Activity获取Fragment中的数据
这个比较简单,通常是Activity 里面有Fragment 的实例,因此可以直接调用实例里面的方法,同时可以通过setArgument来传递初始化值
//在Activity中
MainFragment fragment = new MainFragment();
fragment.setArguments(bundle);
fragment.print()
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.fragment_container, fragment)
.commit();
Fragmenet调用Activity里面的方法
Fragment中文名是碎片,通常是就是多个View的封装,因此为了可以复用,需要跟具体的Activity解耦。具体的方法就是使用接口的方式来实现
class SomeFragment extends Fragment {
ICommunication callback;
interface ICommunication {
void communicate(...);
}
override onAttach(){
callback =((ICommunication)getActivity())
}
void sendMessageToActivity() {
callback.communicate(...);
}
}
class ParentActivity extend FragmentActivity implements ICommunication {
@Override
void communicate(...) {
//TODO do some thing
}
}
Fragment和Fragment之间的通信
最好是不用互相引用,而是通过, Fragment-》Activity->Fragmnet 这样来调用。
其他
- 使用EventBus来实现数据通信。在Fragment和Activity之间不要用,比较不好跟踪数据
#参考