Android getIntent()。getExtras()返回null

时间:2011-05-10 02:22:55

标签: java android

我正在尝试在两个活动之间传递一个字符串。我在其他项目中使用相同的方法完成了这个,但由于某种原因,当我调用intent.getStringExtra(String)时,我得到一个NullPointerException。我也试过通过

为附加组件创建一个Bundle
Bundle 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);

我已经尝试过几乎所有传递额外内容的替代方法,但它们似乎都表现得这样。我错过了什么?

7 个答案:

答案 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");      
}