我正在尝试在两个活动之间传递一个字符串。我在其他项目中使用相同的方法完成了这个,但由于某种原因,当我调用intent.getStringExtra(String)时,我得到一个NullPointerException。我也试过通过
为附加组件创建一个BundleBundle b = getIntent().getExtras();
但是也返回了null。以下是我目前正在尝试使用的代码。
活动A:
Intent myIntent = null;
String select = "";
if (selection.equals("Chandelle")) {
myIntent = new Intent(Commercial.this, Chandelle.class);
select = "Chandelle";
} else if (selection.equals("Eights on Pylons")) {
myIntent = new Intent(Commercial.this, EightsOnPylons.class);
select = "Eights on Pylons";
}
// Start the activity
if (myIntent != null) {
myIntent.putExtra("selection", select);
Log.d("*** OUTBOUND INTENT: ", "" + myIntent.getExtras().get("selection"));
startActivity(myIntent);
}
以下是活动B中试图提取额外费用的代码:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
if (i == null)
Log.d("***DEBUG****", "Intent was null");
else
Log.d("**** DEBUG ***", "Intent OK");
String MANEUVER_ID = i.getStringExtra("selection"); //Exception points to this line
Log.d("*** DEBUG", rec + " " + MANEUVER_ID);
我已经尝试过几乎所有传递额外内容的替代方法,但它们似乎都表现得这样。我错过了什么?
答案 0 :(得分:12)
将.ToString()
添加到myIntent.putExtra("selection", select);
,使其为myIntent.putExtra("selection", select.ToString());
答案 1 :(得分:8)
幸运的是我发现了这篇文章。几个小时以来我一直在努力奋斗,最后我意识到我也将我的意图发送到了tabHost。 ;-)对于那些仍然遇到问题的人,只需从tabHost活动本身获取额外内容并将其传递给子标签。
String userID;
。
Bundle getuserID = getIntent().getExtras();
if (getuserID != null) {
userID = getuserID.getString("userID");
}
...
intent = new Intent().setClass(this, Games.class);
intent.putExtra("userID", userID);
spec = tabHost.newTabSpec("games").setIndicator("Games",
res.getDrawable(R.drawable.tab_games))
.setContent(intent);
tabHost.addTab(spec);
答案 2 :(得分:5)
尝试以下代码。我已经为你的代码添加了一个覆盖,它可以解决这个问题:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent i = getIntent();
if (i == null)
Log.d("***DEBUG****", "Intent was null");
else
Log.d("**** DEBUG ***", "Intent OK");
String MANEUVER_ID = i.getStringExtra("selection"); //Exception points to this line
Log.d("*** DEBUG", rec + " " + MANEUVER_ID);
}
答案 3 :(得分:2)
如果你还没有在套装中放任何东西,它将始终返回null
!
您可以自己创建和设置捆绑包:
Intent i = new Intent( ... );
i.putExtras(new Bundle());
Bundle bundle= i.getExtras(); // (not null anymore)
或者,设置一个虚拟值来强制初始化(我更喜欢第一个解决方案):
Intent i = new Intent( ... );
i.putExtra("dummy", true);
Bundle bundle= i.getExtras(); // (not null anymore)
答案 4 :(得分:1)
查看您的代码,我认为当您在Activity 1中放入任何内容时可能会发生这种情况。因为您使用“if ... else if”,而您没有“else”用于其他情况。如果发生这种情况,那么您将在活动2中获得空值。再次检查这种情况。
答案 5 :(得分:1)
当我在使用putExtra()之前确定不启动startAcitvity()时,我的问题得以解决。 新手的错误,但我希望有人会发现它有用。
我更改了
Intent i1 = new Intent(MainActivity.this,Second.class);
startActivity(i1);
String abc = e1.getText().toString();
i1.putExtra("user",abc);
对此
Intent i1 = new Intent(MainActivity.this,Second.class);
String abc = e1.getText().toString();
i1.putExtra("user",abc);
startActivity(i1);
答案 6 :(得分:-1)
在活动B中您可以使用以下功能:
protected String getStringExtra(Bundle savedInstanceState, String id) {
String l;
l = (savedInstanceState == null) ? null : (String) savedInstanceState
.getSerializable(id);
if (l == null) {
Bundle extras = getIntent().getExtras();
l = extras != null ? extras.getString(id) : null;
}
return l;
}
您在活动B中以下列方式使用它:
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
String MANEUVER_ID = getStringExtra(savedInstanceState, "selection");
}