【问题标题】:startActivityForResult returns the correct result, but then it becomes nullstartActivityForResult 返回正确的结果,但随后变为 null
【发布时间】:2017-08-29 01:57:01
【问题描述】:

我有一个返回用户名的 startActivityForResult。 onActivityResult 中的这段代码返回新的用户名,日志函数返回它就证明了这一点。

// return user initials from popup
 setUsername(intent.getStringExtra("USERNAME"));
 Log.d("ME", "Username is now :" + getUsername()); //returning the real result

结果返回到 MainActivity 后,我有一个从 getUsername() 读取的共享首选项函数;

SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
        setUsername(sp.getString("USERNAME", ""));

这只是返回"" 而不是应该写入setUsername() 的内容。作为参考,我的方法是:

private void setUsername(String name) {
    username = name;
}

private String getUsername() {
    return username;
}

// called during onDestroy()
void write() {
    SharedPreferences.Editor editor = getPreferences(Context.MODE_PRIVATE).edit();
    editor.putString("USERNAME", getUsername());
    editor.putBoolean("FIRST_RUN", firstRun);
    editor.apply();
}

// called during onStart()
void read() {
    SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
    setUsername(sp.getString("USERNAME", ""));
    firstRun = sp.getBoolean("FIRST_RUN", true);
}

在另一堂课中,我将用户名写入共享首选项:

private void write() {
    SharedPreferences.Editor editor = getPreferences(Context.MODE_PRIVATE).edit();
    editor.putString("USERNAME", etInitials.getText().toString());
    editor.apply();
}

【问题讨论】:

  • 你没有在你展示给我们的代码中调用 write,所以你实际上并没有把它放在共享偏好中。
  • 编辑澄清何时调用 read() 和 write()

标签: android sharedpreferences startactivityforresult


【解决方案1】:
SharedPreferences sp = getPreferences(Context.MODE_PRIVATE);
    setUsername(sp.getString("USERNAME", ""));

您确实意识到第二行正在设置正确的值,因此您设置的不是获取名称。

void write() {
SharedPreferences.Editor editor = getPreferences(Context.MODE_PRIVATE).edit();
editor.putString("USERNAME", getUsername());
editor.putBoolean("FIRST_RUN", firstRun);
editor.apply();
}

上面的方法需要先调用,用这个intent.getStringExtra("USERNAME")

【讨论】:

  • 问题是您没有调用 write,因此默认字符串的值始终为空,即您的结果为空。
  • 你是在设置之前先获取值,为了证明这一点,用设置值声明变量,再试一次?
  • 我在onStart() 期间打电话给read()。共享偏好应该在我拉起活动以获得结果时完成。我会尝试使用一个单独的值,看看是否是导致缺陷的原因。
  • 问题在于执行的命令式调用链。
  • 如果我是对的,当返回结果时,您首先要解析意图,然后将其存储在首选项文件中,对或错
【解决方案2】:

假设“其他类”在onDestroy期间调用了write方法,那么会先调用主Activity上的onActivityResult:

OtherActivity   >>> onPause
MainActivity    >>> onActivityResult
MainActivity    >>> onRestart
MainActivity    >>> onStart
MainActivity    >>> onResume
MainActivity    >>> onPostResume
OtherActivity   >>> onStop
OtherActivity   >>> onDestroy

【讨论】:

  • 感谢您的操作顺序。这澄清了在onActivityResult 阶段写入首选项的另一个答案。
猜你喜欢
  • 2012-07-11
  • 1970-01-01
  • 2017-11-28
  • 2014-09-13
  • 2019-04-20
  • 1970-01-01
  • 2015-01-14
  • 2016-12-22
  • 2018-05-19
相关资源
最近更新 更多