【问题标题】:How to get extra that is passed through several activities when using startActivityForResult() in parent activity?在父活动中使用 startActivityForResult() 时,如何获得通过多个活动传递的额外信息?
【发布时间】:2018-06-10 07:12:28
【问题描述】:

我想做一个测验应用程序。活动流程如下: MainActivity -> ProfileActivity -> NewProfileActivity -> QuestionActivity -> ResultActivity -> Main Activity。

在 ProfileActivity 上,它将显示一个名称列表(使用 recyclerview)。它有一个调用 startActivityForResult() 的按钮。在 NewProfileActivity 上,它有一个按钮,可以将额外的字符串发送回 ProfileActivity。

问题是,我不希望 NewProfileActivity 回到 ProfileActivity。如何通过几个activity传递额外的然后显示在ProfileActivity上?

在 ProfileActivity 中

    Intent intent = getIntent();

    FloatingActionButton fab = (FloatingActionButton) findViewById(R.id.fab);
    fab.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Intent intent = new Intent(ProfileActivity.this, NewProfileActivity.class);
            startActivityForResult(intent, NEW_PROFILE_ACTIVITY_REQUEST_CODE);
        }
    });

在 onActivityResult() 方法中

public void onActivityResult(int requestCode, int resultCode, Intent intent) {
    super.onActivityResult(requestCode, resultCode, intent);

    if (requestCode == NEW_PROFILE_ACTIVITY_REQUEST_CODE && resultCode == RESULT_OK) {
        Profile profile = new Profile(intent.getStringExtra("profile_name"));
        mProfileViewModel.insert(profile);
    } else {
        Toast.makeText(getApplicationContext(),
                R.string.empty_not_saved,
                Toast.LENGTH_LONG).show();
    }
}

在 NewProfileActivity 中

final Button save_profile_button = findViewById(R.id.button_save);
    save_profile_button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            String profile_name = mProfileNameView.getText().toString();
            Intent intent = new Intent(NewProfileActivity.this, QuestionActivity.class);
            intent.putExtra("profile_name_extra", profile_name);
            startActivity(intent);
        }
    });

为简单起见,对于其余的活动,我通过将这段代码放在 onCreate 方法上来传递额外内容:

Intent intent = getIntent();
    final String profile_name = intent.getStringExtra("profile_name_extra");

在按钮上,我输入了以下代码:

Intent intent = new Intent(QuestionActivity.this, ResultActivity.class);
            intent.putExtra("profile_name_extra", profile_name);

【问题讨论】:

  • 您能更清楚地说明您要达到的目标吗?
  • 在NewProfileActivity中,用户需要输入自己的名字,这个名字会显示在ProfileActivity上。它以前可以工作,但是当单击 NewProfileActivity 中的按钮时,它会返回到 ProfileActivity。但我希望它转到 QuestionActivity。
  • 您按的是哪个按钮,该按钮执行了哪些操作?您是在谈论后退按钮还是您已实现的一些自定义按钮?
  • NewProfileActivity 中的按钮。一个自定义按钮。
  • 该按钮将始终指向 QuestionActivity。如果您想像下面的评论者提到的那样跨活动存储数据,您可以简单地使用共享首选项。

标签: android android-intent startactivityforresult


【解决方案1】:

您可以将数据放入 sharedPreferences 对象中,然后在您可以在任何活动中检索它。这样,您可以避免在多个活动之间来回传递数据的开销。 因此,在您的 NewProfileActivity 中,将附加内容保存到 sharedPreferences 中,然后在您想要的任何地方再次获取它。 从 sharedPreferences 写入和读取数据的文档可以在这里找到

https://developer.android.com/training/data-storage/shared-preferences

希望这会有所帮助。

【讨论】:

  • 感谢您的回复。当我想使用共享首选项时,我还需要使用 startActivityForResult() 还是只使用 startActivity()?
  • 现在可以只使用startActivity(),不需要调用startActivityForResult()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-13
  • 1970-01-01
相关资源
最近更新 更多