¿Cómo obtengo datos adicionales de la intención en Android?

751

¿Cómo puedo enviar datos de una actividad (intento) a otra?

Yo uso este código para enviar datos:

Intent i=new Intent(context,SendMessage.class);
i.putExtra("id", user.getUserAccountId()+"");
i.putExtra("name", user.getUserFullName());
context.startActivity(i);
Adham
fuente
82
Nota al margen de Java: Nunca es una buena idea "stringificar" un entero como ese (especialmente para fines de ejemplo), y desafortunadamente a menudo se considera una buena y rápida forma de convertir int a string en java: user.getUserAccountId()+""ya que esto crearía objetos innecesarios para ser recogido. Considere usar String.valueOf(user.getUserAccountId), o en su Integer.toString(user.getUserAccountId)lugar.
pkk
55
@ Andrew S ¿No es esta la web? Este es el resultado número uno para "obtener datos de la intención"
McGuile
@ Andrew Estoy de acuerdo con McGuile. Además, esta pregunta se publicó hace un tiempo, por lo que la respuesta probablemente no fue tan fácil de encontrar en ese entonces. Y si una pregunta similar aún no se había publicado en SO, entonces era una publicación válida.
0xCursor

Respuestas:

1213

Primero, obtenga la intención que ha comenzado su actividad utilizando el getIntent()método:

Intent intent = getIntent();

Si sus datos adicionales se representan como cadenas, puede usar el intent.getStringExtra(String name)método. En tu caso:

String id = intent.getStringExtra("id");
String name = intent.getStringExtra("name");
Malcolm
fuente
66
¿De dónde puedo hacer todo este método?
Adham el
46
@adham: Si está en una actividad, desde onCreate, llame getIntent().getStringExtra("id");para obtener la cadena de identificación
ccheneson
1
Puede obtener la intención que inició su actividad llamando al getIntent()método. He actualizado la respuesta.
Malcolm
1
@Eatlon Si tiene un problema con una biblioteca específica, debe crear una pregunta separada al respecto.
Malcolm
1
@MelColm, ¿cuál es la diferencia entre getExtra (). GetString y getStringExtra ()?
Amit Tripathi
188

En la actividad receptora

Bundle extras = getIntent().getExtras(); 
String userName;

if (extras != null) {
    userName = extras.getString("name");
    // and get whatever type user account id is
}
NickT
fuente
66
¿Por qué es preferible estogetStringExtra?
IgorGanapolsky
66
Mi suposición es: si los extras pueden ser null, se puede omitir toda la búsqueda de extras. Al usarlo getStringExtra, básicamente lo cambias a una serie de if(extras != null) { return extras.getString(name) }. Uno por cada getStringExtrallamada. Esta opción verificará por nulluna vez y, de ser así, no se molestará en leerla Bundle. Además de eso, getStringExtraprobablemente seguirá preguntando getExtrasinternamente también cada vez. Entonces simplemente tiene más llamadas a funciones.
Daniël Sonck
39
//  How to send value using intent from one class to another class
//  class A(which will send data)
    Intent theIntent = new Intent(this, B.class);
    theIntent.putExtra("name", john);
    startActivity(theIntent);
//  How to get these values in another class
//  Class B
    Intent i= getIntent();
    i.getStringExtra("name");
//  if you log here i than you will get the value of i i.e. john
Sumit Sharma
fuente
31

Agregar

Establecer datos

String value = "Hello World!";
Intent intent = new Intent(getApplicationContext(), NewActivity.class);
intent.putExtra("sample_name", value);
startActivity(intent);

Obtener datos

String value;
Bundle bundle = getIntent().getExtras();
if (bundle != null) {
    value = bundle.getString("sample_name");
}
kenju
fuente
17

En lugar de inicializar otra nueva intención para recibir los datos, simplemente haga esto:

String id = getIntent().getStringExtra("id");
r_allela
fuente
11

Si se usa en una FragmentActivity, intente esto:

La primera página extiende FragmentActivity

Intent Tabdetail = new Intent(getApplicationContext(), ReceivePage.class);
Tabdetail.putExtra("Marker", marker.getTitle().toString());
startActivity(Tabdetail);

En el fragmento, solo debes llamar getActivity()primero,

La segunda página extiende Fragmento :

String receive = getActivity().getIntent().getExtras().getString("name");
Bundit Ng
fuente
1
También podría usar getStringExtra ("nombre") en lugar de getExtras (). GetString ("nombre")
Plot
7

Si está tratando de obtener datos adicionales en fragmentos, puede intentar usar:

Colocar datos usando:

Bundle args = new Bundle();
args.putInt(DummySectionFragment.ARG_SECTION_NUMBER);

Obtenga datos usando:

public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {


  getArguments().getInt(ARG_SECTION_NUMBER);
  getArguments().getString(ARG_SECTION_STRING);
  getArguments().getBoolean(ARG_SECTION_BOOL);
  getArguments().getChar(ARG_SECTION_CHAR);
  getArguments().getByte(ARG_SECTION_DATA);

}
star18bit
fuente
6

Puede obtener cualquier tipo de datos adicionales por intención , sin importar si es un objeto o cadena o cualquier tipo de datos.

Bundle extra = getIntent().getExtras();

if (extra != null){
    String str1 = (String) extra.get("obj"); // get a object

    String str2 =  extra.getString("string"); //get a string
}

y la solución más corta es:

Boolean isGranted = getIntent().getBooleanExtra("tag", false);
Hasib Akter
fuente
4

** Poner datos por intención - **

 Intent intent = new Intent(mContext, HomeWorkReportActivity.class);
            intent.putExtra("subjectName","Maths");
            intent.putExtra("instituteId",22);
            mContext.startActivity(intent);

** Obtener datos por intención - **

  String subName = getIntent().getStringExtra("subjectName");
  int insId  getIntent().getIntExtra("instituteId",0);

si enviamos el valor entero por intención. cuando debemos usar el segundo parámetro 0 en getIntent (). getIntExtra ("instituteId", 0) de lo contrario no usamos 0, entonces Android me da un error.

Om Prakash Sharma
fuente
2

Kotlin

Primera actividad

val intent = Intent(this, SecondActivity::class.java)
intent.putExtra("key", "value")
startActivity(intent)

Segunda actividad

val value = getIntent().getStringExtra("key")

Sugerencia

Siempre coloque las claves en un archivo constante para una forma más administrada.

companion object {
    val PUT_EXTRA_USER = "PUT_EXTRA_USER"
}
Khemraj
fuente
1

Sólo una sugerencia:

En lugar de usar "id" o "name" en su i.putExtra ("id" .....), sugeriría, cuando tenga sentido, usar los campos estándar actuales que se pueden usar con putExtra (), es decir Intención.EXTRA_something.

Se puede encontrar una lista completa en Intent (Desarrolladores de Android).

eva
fuente
1

Podemos hacerlo por medios simples:

En FirstActivity:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

En SecondActivity:

    try {
        Intent intent = getIntent();

        String uid = intent.getStringExtra("uid");
        String pwd = intent.getStringExtra("pwd");

    } catch (Exception e) {
        e.printStackTrace();
        Log.e("getStringExtra_EX", e + "");
    }
sam
fuente
1

Pase la intención con valor en la primera actividad:

Intent intent = new Intent(FirstActivity.this, SecondActivity.class);
intent.putExtra("uid", uid.toString());
intent.putExtra("pwd", pwd.toString());
startActivity(intent);

Recibir intención en la segunda actividad; -

Intent intent = getIntent();
String user = intent.getStringExtra("uid");
String pass = intent.getStringExtra("pwd");

Usamos generalmente dos métodos para enviar el valor y obtener el valor. Para el envío del valor vamos a utilizar intent.putExtra("key", Value);y durante la intención de recibir otra actividad vamos a utilizar intent.getStringExtra("key");para obtener los datos de intención como Stringo utilizar algún otro método disponible para obtener otros tipos de datos ( Integer, Boolean, etc.). La clave puede ser cualquier palabra clave para identificar el valor, es decir, qué valor está compartiendo. Espero que funcione para ti.

Pradeep Sheoran
fuente
0

También puede hacer esto
// poner valor en la intención

    Intent in = new Intent(MainActivity.this, Booked.class);
    in.putExtra("filter", "Booked");
    startActivity(in);

// obtener valor de la intención

    Intent intent = getIntent();
    Bundle bundle = intent.getExtras();
    String filter = bundle.getString("filter");
Savita Sharma
fuente
0

Obteniendo diferentes tipos de extra de intención

Para acceder a los datos de Intent debes saber dos cosas.

  • LLAVE
  • Tipo de datos de sus datos.

Existen diferentes métodos en la clase Intent para extraer diferentes tipos de tipos de datos. Se parece a esto

getIntent (). XXXX (KEY) o intent.XXX (KEY);


Entonces, si conoce el tipo de datos de su varibale que configuró en otherActivity, puede usar el método respectivo.

Ejemplo para recuperar la cadena en su actividad del intento

String profileName = getIntent().getStringExtra("SomeKey");

Lista de diferentes variantes de métodos para diferentes tipos de datos

Puede ver la lista de métodos disponibles en la Documentación oficial de intención .

Rohit Singh
fuente
0

Esto es para el adaptador, para la actividad solo necesita cambiar mContext a su nombre de Activty y para el fragmento necesita cambiar mContext para getActivity ()

 public static ArrayList<String> tags_array ;// static array list if you want to pass array data

      public void sendDataBundle(){
            tags_array = new ArrayList();
            tags_array.add("hashtag");//few array data
            tags_array.add("selling");
            tags_array.add("cityname");
            tags_array.add("more");
            tags_array.add("mobile");
            tags_array.add("android");
            tags_array.add("dress");
            Intent su = new Intent(mContext, ViewItemActivity.class);
            Bundle bun1 = new Bundle();
            bun1.putString("product_title","My Product Titile");
            bun1.putString("product_description", "My Product Discription");
            bun1.putString("category", "Product Category");
            bun1.putStringArrayList("hashtag", tags_array);//to pass array list 
            su.putExtras(bun1);
            mContext.startActivity(su);
        }
Android Geek
fuente
-2

Acabo de publicar una respuesta aquí que cubre este tema con un poco más de detalle, incluidas algunas alternativas.

Utiliza Vapor API , un nuevo marco de Android inspirado en jQuery que escribí para simplificar el desarrollo de Android. Vea el ejemplo en esa respuesta para saber cómo puede pasar fácilmente datos entre actividades.

También se muestra VaporIntent, lo que le permite encadenar llamadas de método y utilizar el .put(...)método sobrecargado :

$.Intent().put("data", "myData").put("more", 568)...

Puede pasar fácilmente datos por toda su aplicación utilizando la API de Vapor , por lo que esperamos que sea útil para usted y para otros durante el desarrollo de la aplicación.

Darius
fuente
1
Había visto algunas de sus respuestas sobre Vapor API. Es interesante. ¿Cómo obtiene esos datos (como Intent.getextras ())?
Kalai.G
Mira esto , explica cómo recuperar los extras de Intención. Más detalles están aquí . ¿Eso ayuda?
Darius
2
Creo que encadenar métodos tiene demasiada sobrecarga. Si está llamando a cualquier método que devuelve "esto" solo para ser encadenable (es decir, "establecedores") está violando los principios de diseño de OOP. Me gusta la simplicidad, pero la depuración también puede ser una molestia si tienes una cadena de métodos. Veo valor en la API, simplemente no estoy de acuerdo con el método de encadenamiento.
nckbrz