На самом деле стандартный способ передачи параметров дочерним действиям и фрагментам - через 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();
}
.
.
.
А потом в вызывающей деятельности:
.
.
.
@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")
}
}