其实给子activity和fragment传递参数的标准方式是通过Intents。您可以传递任何原始值、原始对象的任何数组[]、一些 ArrayLists,甚至任何Parcelable 对象,
我在我的代码中使用以下例程:
public static void runChildActivity(@NonNull Activity context, int code, @NonNull Class<? extends Activity> activityClass, @Nullable Bundle parameters) {
Intent intent = new Intent(context, activityClass);
if (parameters != null) intent.putExtras(parameters);
context.startActivityForResult(intent, code);
}
然后,你可以这样称呼它:
Bundle parameters = new Bundle();
parameters.putString("page_id", xxxx);
parameters.putFloat("temperature", 24.5f);
parameters.putParcelable("complexobject", yourParcelableObject);
runChildActivity(context, CODE, PostsActivity.class, parameters);
参数CODE (int) 是您分配给activity 的代码,以防万一它也返回值。然后,您可以在调用活动中检查覆盖的onActivityResult() 中的返回值。如果您的活动没有返回任何值,则该参数无关紧要。
在子活动中,您可以在onCreate(或它之后的任何位置)中获取参数:
@Override
public void onCreate(Bundle savedInstanceState) {
Bundle parameters = getIntent().getExtras();
// in a fragment it'd be
// Bundle parameters = getArguments();
// those are the parameters passed. Second value is default
// value in case parameter is not found.
String pageId = parameters.getString("page_id", "-1");
float temperature = parameters.getFloat("temperature", 0f);
}
如果您想将子活动中的内容返回给父活动,则在子活动中使用setResult() finish():
. (child activity)
.
.
private void finishWithParameters() {
Bundle parameters = new Bundle();
parameters.putString("returnvalue", "user is crazy");
parameters.putInteger("filesdownloaded", 43);
Intent i = new Intent();
i.putExtras(parameters);
setResult(Activity.RESULT_OK, i);
finish();
}
.
.
.
然后在调用activity中:
.
.
.
@Override
public void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
if (requestCode == CODE && data != null) {
// that's the CODE we ran runChildActivity() with
// so stuff is coming from that child activity
Bundle parameters = data.getExtras();
int filesDownloaded = parameters.getInt("filesDownloaded")
// ... or directly, without even getting the bundle ....
int filesDownloaded2 = data.getIntExtra("filesDownloaded")
}
}