开发者

Android getIntent().getExtras() returns null

开发者 https://www.devze.com 2023-03-04 08:12 出处:网络
I\'m trying to pass a string between two activities. I\'ve done this in other projects using the same method, but for some reason I\'m getting a NullPointerException when I call intent.getStringExtra(

I'm trying to pass a string between two activities. I've done this in other projects using the same method, but for some reason I'm getting a NullPointerException when I call intent.getStringExtra(String). I have also tried creating a Bundle for the extras via

Bundle b = getIntent().getExtras();

but that also returned null. Below is the code that I am currently trying to use.

Activity 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);
    }

Here's the code in activity B that tries to pull t开发者_运维知识库he extra:

    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);

I've tried pretty much every alternative way of passing extras, but they all seem to behave this way. What am I missing?


Add .ToString() to myIntent.putExtra("selection", select); so that it is myIntent.putExtra("selection", select.ToString());


Luckily I found this post. I've been struggling with this for hours and in the end I realized that I'm sending my intent to the tabHost as well. ;-) For those who are still having problems with this just get the extras from the tabHost activity itself and pass it along to the child tabs.

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);


Try the code below. I have added an override to your code, which will do the trick:

@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);
}


Look at your code, I think it may happen when you did put anything in Activity 1. Because you use "if...else if", and you don't have "else" for other cases. If that happens then you will get null value in the Activity 2. Check again this case.


If you still have not put anything in the bundle, it will always return null!

You can create and set the bundle by your own :

Intent i = new Intent( ... );

i.putExtras(new Bundle());

Bundle bundle= i.getExtras(); // (not null anymore)

Or, put a dummy value just to force the initialization (I prefer the first solution):

Intent i = new Intent( ... );

i.putExtra("dummy", true); 

Bundle bundle= i.getExtras(); // (not null anymore)


My problem was resolved when I figured out not to startAcitvity() before I used putExtra(). Newbie mistake but I hope somebody will find it useful.

I changed this

Intent i1 = new Intent(MainActivity.this,Second.class);
    startActivity(i1);
    String abc = e1.getText().toString();
    i1.putExtra("user",abc);

to this

Intent i1 = new Intent(MainActivity.this,Second.class);
    String abc = e1.getText().toString();
    i1.putExtra("user",abc);
    startActivity(i1);


In activity B you at the following function:

  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;
}

You are using it in the following way in activity B:

public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState); 
   String MANEUVER_ID  = getStringExtra(savedInstanceState, "selection");      
}
0

精彩评论

暂无评论...
验证码 换一张
取 消