【问题标题】:Why does the Intent that starts my activity not contain the extras data I put in the Intent I sent to startActivity()?为什么启动我的活动的 Intent 不包含我在发送给 startActivity() 的 Intent 中放入的额外数据?
【发布时间】:2012-11-09 05:29:29
【问题描述】:

我最初解释得很糟糕。这是我的问题:我发送给 startActivity() 方法的 Intent 包含一个私有字段 mMap,它是一个包含我发送给 putExtra() 的字符串的 Map。当目标活动开始时,对 getIntent() 的调用会返回一个包含这些值的 Intent。 mMap 字段为 null。显然,由于对象 ID 不同,View 层次结构的内部或启动新活动的操作系统部分创建了一个新的 Intent 传递给它。

但是为什么呢?为什么 putData() 值没有被带到新的 Intent 中?

启动新活动的活动扩展了活动。这是启动代码:

public boolean onOptionsItemSelected(final MenuItem item) {
    switch (item.getItemId()) {
    case 4:
        i = new Intent(this, StatList.class);
        i.putExtra("Name1", "Test1");
        i.putExtra("Name3", "Test2");
        startActivity(i);
     }   
 }

我已尝试使用和不使用(推荐的)完整包名称前缀的键值。

在 Eclipse 调试器中,我已验证玩家名称的值是否已正确插入到 i.mExtras.mMap 中。

这是来自 startee 的代码:

public class StatList extends ListActivity {
private final StatsListAdapter statsAdapter;

public StatList() {
    statsAdapter = StatsListAdapter.getInstance(this);
} // default ctor

@Override
public void onCreate(final Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    final Intent i = getIntent();
    final Bundle extras = i.getExtras();
          < more code here >
} 

当执行到此方法时,mIntent.mExtras.mMap 为 null,并且 mIntent.mExtras.mParcelledData 现在包含一些看起来不合理的值(它是 null strong> 当 startActivity() 被调用时)。 getIntent() 返回 mIntent。

我也尝试过 startActivityForResult(),结果相同。

根据我在网上和示例应用程序中看到的文档和示例,这应该很容易。我找到了另一种方法来满足我的迫切需要,但我想知道是否有人可以帮助我理解为什么这么简单的事情不起作用。

【问题讨论】:

  • 为什么要为 OnCreate 保存的实例状态包和其他变量使用“final”关键字?
  • 你试过 String test = i.getStringExtra("Name1");看看结果如何?
  • 您的问题不一致 - 您使用名为 iIntents 显示代码,但随后您谈论的是您的代码 sn-ps 中不存在的 mIntent.mExtras.mMap(例如)。是哪个?
  • mIntent 是 Activity 中的字段,其中包含用于启动 Activity 的 Intent。我用调试器检查工具查看了它。 mExtras 是 Intent 中包含额外内容的字段。 mMap 是 Extras 中的字段,用于保存带有额外值的 Map。
  • @Asok mIntentmMapp 是核心 Activity 类的一部分,因此它们没有在他的代码中实例化。我有同样的问题,我创建了一个 Intent,添加了额外内容并启动了新的 Activity,但是当我到达新的 Activity 时,我的数据丢失了,只是 null。目前还没有解决办法。

标签: android android-intent android-activity


【解决方案1】:

在您的主要活动中:

i = new Intent(this, StatList.class);
i.putExtra("Name1", "Test1");
i.putExtra("Name3", "Test2");
startActivity(i);

然后在StatList.class

Bundle extras = getIntent().getExtras();
String name1 = extras.getString("Name1");
String name3 = extras.getString("Name3");
Log.i("StatList", "Name1 = " + name1 + " && Name3 = " + name3)

【讨论】:

  • 没有。 Extras 对象中应保存这些值的映射为空。 getString() 失败。
【解决方案2】:

更新以下两行

最终意图 i = getIntent(); final Bundle extras = i.getExtras();

替换为

Bundle extras = getIntent().getExtras();
if(extras!= null){
String var1= extras.getString("Name1");
String var2= extras.getString("Name2");
}

【讨论】:

  • getString() 因空指针异常而失败。因为应该保存值映射的字段 (mIntent.mExtras.mMap) 为空。
  • 我也遇到了同样的问题
猜你喜欢
  • 2019-12-10
  • 2018-09-15
  • 1970-01-01
  • 2023-03-09
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多