7 Pregunta: Android getIntent (). GetExtras () devuelve un valor nulo

pregunta creada en Tue, May 10, 2011 12:00 AM

Estoy tratando de pasar una cadena entre dos actividades. He hecho esto en otros proyectos usando el mismo método, pero por alguna razón recibo una NullPointerException cuando llamo a intent.getStringExtra (String). También he intentado crear un paquete para los extras a través de

 
Bundle b = getIntent().getExtras();

pero eso también devolvió el valor nulo. A continuación se muestra el código que estoy intentando usar actualmente.

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

Aquí está el código en la actividad B que intenta extraer el 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);

He intentado casi todas las formas alternativas de pasar extras, pero todos parecen comportarse de esta manera. ¿Qué me estoy perdiendo?

    
34
  1. ¿Cómo resolviste este problema?
    2012-05-08 10: 07: 34Z
  2. Otra solución: getExtras (). get ("sharedString")
    2016-08-26 23: 16: 30Z
7 Respuestas                              7                         

Agregue .ToString() al myIntent.putExtra("selection", select); para que sea myIntent.putExtra("selection", select.ToString());

    
12
2013-04-22 23: 50: 38Z
  1. Sí, agrego String.valueOf, ¡funciona!
    2013-09-12 08: 26: 49Z
  2. Esto también solucionó mi problema, ya que pasaba EditText.getText (), que es un objeto editable y aunque putExtra () toma dos cadenas, el compilador no lo hace No te quejes de pasarle un objeto editable.
    2014-02-20 21: 07: 48Z
  3. La razón por la que necesita poner String.valueOf () para el objeto Editable devuelto por EditText.getText () es que asigna direclt a un Serializable, por lo que putExtra (String , Serializable) se utiliza y, por lo tanto, se debe llamar a getSerializableExtra (String).
    2014-08-05 20: 45: 51Z
  4. \| /(> _ <) \| /... necesito un nombre de superhéroe ... :)
    2014-11-19 21: 22: 07Z
  5. ¿Podría editar para explicar por qué esto es necesario? Dado que select ya está declarado como una cadena, ¿por qué necesita invocar toString?
    2015-09-22 20: 05: 44Z

Por suerte he encontrado este post. He estado luchando con esto por horas y al final me di cuenta de que también estoy enviando mi intención a tabHost. ;-) Para aquellos que todavía tienen problemas con esto, solo obtenga los extras de la actividad tabHost y páselos a las pestañas secundarias.

 
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);
    
8
2011-09-22 16: 32: 24Z

Prueba el siguiente código. He añadido una anulación a su código, que hará el truco:

 
@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);
}
    
5
2014-06-07 08: 34: 06Z

Si aún no has puesto nada en el paquete, ¡siempre devolverá null!

Puedes crear y configurar el paquete por tu cuenta:

 
Intent i = new Intent( ... );

i.putExtras(new Bundle());

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

O, ponga un valor ficticio solo para forzar la inicialización (prefiero la primera solución):

 
Intent i = new Intent( ... );

i.putExtra("dummy", true); 

Bundle bundle= i.getExtras(); // (not null anymore)
    
2
2013-11-06 14: 14: 47Z
  1. Creo que el primer caso puede ser nulo después de la muerte del proceso. La segunda opción no será nula. Esa variable ficticia es lo que llamé __EXISTENCE_HOOK__ hace un tiempo por esta razón.
    2018-10-11 19: 35: 13Z

Mire su código, creo que puede suceder cuando puso algo en la Actividad 1. Porque usa "if ... else if", y no tiene "else" para otros casos. Si eso sucede, obtendrá un valor nulo en la Actividad 2. Verifique nuevamente este caso.

    
1
2011-05-10 02: 33: 05Z
  1. Sin suerte. Debería haber sido más específico en la actividad B que publiqué en realidad es EightsOnPylons.java. Además, la declaración Log.d en la actividad uno que imprime "FUERZA DE SALIDA" muestra la Cadena correcta, así que estoy bastante seguro de que el extra se está enviando con la intención.
    2011-05-10 02: 49: 39Z
  2. Encontró el problema. Fue un problema con el diseño del programa, no con el código. La Actividad B era un tabhost que llamaba Actividad C. Intentaba extraer el extra de la Actividad C, pero el extra solo se había enviado de A a C.
    2011-05-10 03: 03: 20Z

Mi problema se resolvió cuando descubrí que no se debía iniciarAcitvity () antes de usar putExtra (). Error de novato, pero espero que alguien lo encuentre útil.

He cambiado esto

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

a esto

 
Intent i1 = new Intent(MainActivity.this,Second.class);
    String abc = e1.getText().toString();
    i1.putExtra("user",abc);
    startActivity(i1);
    
1
2019-03-26 19: 57: 49Z

En la actividad B estás en la siguiente función:

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

Lo estás usando de la siguiente manera en la actividad B:

 
public void onCreate(Bundle savedInstanceState) {
   super.onCreate(savedInstanceState); 
   String MANEUVER_ID  = getStringExtra(savedInstanceState, "selection");      
}
    
- 1
2015-03-10 19: 50: 11Z
fuente colocada aquí