总结:Activity和Fragment之间的数据传递

数据的传递是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-alpha02Fragment 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之间不要用,比较不好跟踪数据

#参考

  • Activity&Fragment通信全解
  • onActivityResult新API
  • 更优雅的使用startActivityForResult及权限请求

你可能感兴趣的:(Java,Android)