我正在构建一个Android应用程序,当前用户的后续页面是可点击的,我保存点击的页面ID并传递它以打开相应的页面, 一旦打开,用户就可以查看关注者列表,页面内的帖子等等。
这是包含所有页面子节点的根节点(数据库Firebase结构):
pageData
id1
+page_id
+page_name
+page_posts
-001
-post_id
-contents
....
userData
-001
-user_id
-user_name
....
followData
-001
-page_id
-follow_id
-user_id
在(followersListActivity,PostsActivity,AboutPageActivity)之间传递页面ID的最佳方法是什么?
我读了这个https://github.com/flutter/flutter/issues/15307,它说不使用共享首选项,我已经使用了Intents传递值,并在onCreate()
内检索它,但是当活动状态发生变化时(onStart() page_id为null),我用于导航底部导航菜单。
编辑解决方案:Jeff Gilfelt谢谢 Android global variable
答案 0 :(得分:2)
你不应该滥用sharePreferences来在活动之间传递数据是正确的,你总是可以用 onSaveInstanceState 方法保存你的数据:
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putString("page_id", pageID);
}
并从 onRestoreInstanceState 或 onCreate 检索它:
@Override
public void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
pageID = savedInstanceState.getString("page_id");
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState!=null)
pageID = savedInstanceState.getString("page_id");
}
答案 1 :(得分:1)
实际上,将参数传递给子活动和片段的标准方法是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")
}
}