【问题标题】:Returning string from Android Activity started with `startActivityForResult` inside `onClickListener` returns null从 `onClickListener` 中以 `startActivityForResult` 开始的 Android Activity 返回字符串返回 null
【发布时间】:2016-03-14 19:52:28
【问题描述】:

我使用MainActivity 中的Intent 来启动另一个名为MatchesActivityActivity 使用startActivityForResult。我在已启动的活动 (MatchesActivity) 中的 finish()onActivityResult 内的 Log 语句上设置断点,因为我在 onActivityResult 内设置了 NPE。

intent.getStringExtra("TXAMATCHES") 包含它应该包含的内容。

但是Intent data 又回来了null

这可能/可能是因为我在 onClick 侦听器中启动了 Intent

或者是因为MatchesActivity 调用了另一个扩展AsyncTask 的类中的方法,而数据就是该任务产生的数据? (但正确的数据在txaMatches中找到,就在它返回到MainActivity之前...)

public class MainActivity extends Activity 
{
    ...
  btnSearch.setOnClickListener(new View.OnClickListener() {
  @Override public void onClick(View v) 
  {
    ...
    Intent matchesIntent;
    matchesIntent = new Intent(MainActivity.this, MatchesActivity.class);
    startActivityForResult(matchesIntent, 0);
    ...
  }
  ...
  @Override protected void onActivityResult(int requestCode, int resultCode, Intent data) 
  {
    Log.w("MainActivity","" + onActivityResult " + data.getStringExtra("TXAMATCHES"));
  }
}

...

public class MatchesActivity extends Activity implements DatabaseConnector.DatabaseProcessListener
{
  ...
  @Override protected void onDestroy()
  {
    super.onDestroy();
    finishThisAndReturnString();

  }
  public void finishThisAndReturnString()
  {
    Intent intent = new Intent();
    intent.putExtra("TXAMATCHES",txaMatches.getText().toString());
    setResult(RESULT_OK, intent);
    finish();
  }

(启动的Activity被用户按下back图标终止。)

【问题讨论】:

  • 您是否从onClickListener() 的某个位置加载String
  • "但是 Intent 数据返回 null。" -- 嗯,你没有向Intent 提供Uri。因此,getData() 将返回 null。我觉得我错过了什么。
  • @CommonsWare--好吧,我肯定错过了一些东西。未知水域。我会检查参数。希望就这么简单。
  • @helldawg13--字符串被加载到一个从onClickListener所在的位置移除两次的类中,即MainActivity,它以MatchesActivity开头作为ActivityForResult', which calls a method in DatabaseConnector`,即AsyncTask,这是创建字符串的位置。
  • @CommonsWare--我见过的示例有 Intent(为结果而启动)通过 Intent intent = new Intent( ) 返回值,没有参数。所以我不确定我需要在哪里指定Uri 或者它应该是什么......

标签: java android android-fragments android-intent


【解决方案1】:

您无法在 onDestroy 方法中完成活动。在这个生命周期阶段,活动已经死亡。

finish() 方法的调用将调用 onDestroy,而不是另一个。

当你想完成 MatchesActivity 时调用 finish 方法。

【讨论】:

    【解决方案2】:

    您尝试执行的操作不正确。您正在尝试在 onDestroy() 方法上调用 finish()onDestroy() 在 Activity 即将被杀死时被调用。所以基本上在那个时候调用finish()是错误的。

    我假设您正在尝试在AsyncTask 中进行一些处理。建议你在AsyncTask的onPostExecute()方法上调用finish()方法。

    【讨论】:

    • @Ruchira--我基本上已经按照你的第二段建议做了。我的onPostExecute 方法使用参数true 调用interface ProcessingIsDone,它立即将控制权指向finishThisAndReturnString。你的第一段解决了我的问题,@Cl 的上一个答案也解决了我的问题
    【解决方案3】:

    您正在 onDestroy() 方法中设置 Intent 对象中的数据。因此,在这种情况下,每当您在 onDestroy() 方法中调用 setResult() 时,您总是会在 onActivityResult() 中将 resultCode 设为 '0',这是 RESULT_CANCELED 的值,而每当您在 onActivityResult() 中获得 RESULT_CANCELED 时,您获取data 对象为空。这就是为什么你没有得到你在 Intent 中设置的值的原因。

    【讨论】:

      【解决方案4】:

      首先尝试获取的值

      txaMatches.getText().toString()

      在 MatchesActivity 类中检查这个值。

      它可能返回空值,因为你遇到了问题。

      【讨论】:

        【解决方案5】:

        如前两个答案所述,通过从onDestroy 中删除finishThisAndReturnString() 即可解决此问题。

        【讨论】:

          猜你喜欢
          • 2016-12-22
          • 2011-01-30
          • 1970-01-01
          • 2016-03-15
          • 1970-01-01
          • 1970-01-01
          • 2012-09-18
          • 1970-01-01
          相关资源
          最近更新 更多