una - tipos de variables en android studio




¿Cómo paso datos entre Actividades en la aplicación de Android? (20)

Respuesta suplementaria: Convenciones de nomenclatura para la cadena de clave

El proceso real de pasar datos ya ha sido respondido, sin embargo, la mayoría de las respuestas utilizan cadenas codificadas para el nombre de clave en la Intención. Esto usualmente está bien cuando se usa solo dentro de su aplicación. Sin embargo, la documentación recomienda usar las constantes EXTRA_* para los tipos de datos estandarizados.

Ejemplo 1: Uso de las teclas Intent.EXTRA_*

Primera actividad

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(Intent.EXTRA_TEXT, "my text");
startActivity(intent);

Segunda actividad:

Intent intent = getIntent();
String myText = intent.getExtras().getString(Intent.EXTRA_TEXT);

Ejemplo 2: Definiendo tu propia clave static final

Si una de las Intent.EXTRA_* no se ajusta a sus necesidades, puede definir la suya al comienzo de la primera actividad.

static final String EXTRA_STUFF = "com.myPackageName.EXTRA_STUFF";

Incluir el nombre del paquete es solo una convención si solo está usando la clave en su propia aplicación. Pero es una necesidad para evitar conflictos de nombres si está creando algún tipo de servicio al que otras aplicaciones pueden llamar con una intención.

Primera actividad:

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(EXTRA_STUFF, "my text");
startActivity(intent);

Segunda actividad:

Intent intent = getIntent();
String myText = intent.getExtras().getString(FirstActivity.EXTRA_STUFF);

Ejemplo 3: Uso de una clave de recurso de cadena

Aunque no se menciona en la documentación, esta respuesta recomienda utilizar un recurso de String para evitar dependencias entre actividades.

strings.xml

 <string name="EXTRA_STUFF">com.myPackageName.MY_NAME</string>

Primera actividad

Intent intent = new Intent(getActivity(), SecondActivity.class);
intent.putExtra(getString(R.string.EXTRA_STUFF), "my text");
startActivity(intent);

Segunda actividad

Intent intent = getIntent();
String myText = intent.getExtras().getString(getString(R.string.EXTRA_STUFF));

Tengo un escenario donde, después de iniciar sesión a través de una página de inicio de sesión, habrá un button cierre de sesión en cada activity .

Al hacer clic en sign-out , pasaré el session id de session id del usuario que inició sesión para cerrar sesión. ¿Alguien me puede guiar sobre cómo mantener el session id disponible para todas las activities ?

Cualquier alternativa a este caso


Charlie Collins me dio una answer perfecta usando Application.class . No sabía que pudiéramos subclasificar tan fácilmente. Aquí hay un ejemplo simplificado usando una clase de aplicación personalizada.

AndroidManifest.xml

Dé el atributo android:name para usar su propia clase de aplicación.

...
<application android:name="MyApplication"
    android:allowBackup="true"
    android:icon="@drawable/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme" >
....

MyApplication.java

Utilice esto como un titular de referencia global. Funciona bien dentro de un mismo proceso.

public class MyApplication extends Application {
    private MainActivity mainActivity;

    @Override
    public void onCreate() {
        super.onCreate();
    }

    public void setMainActivity(MainActivity activity) { this.mainActivity=activity; }
    public MainActivity getMainActivity() { return mainActivity; }
}

MainActivity.java

Establezca la referencia global "singleton" a la instancia de la aplicación.

public class MainActivity extends Activity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ((MyApplication)getApplication()).setMainActivity(this);
    }
    ...

}

MyPreferences.java

Un ejemplo simple donde uso una actividad principal de otra instancia de actividad.

public class MyPreferences extends PreferenceActivity
            implements SharedPreferences.OnSharedPreferenceChangeListener {
    @SuppressWarnings("deprecation")
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.preferences);
        PreferenceManager.getDefaultSharedPreferences(this)
            .registerOnSharedPreferenceChangeListener(this);
    }

    @Override
    public void onSharedPreferenceChanged(SharedPreferences prefs, String key) {
        if (!key.equals("autostart")) {
            ((MyApplication)getApplication()).getMainActivity().refreshUI();
        }
    }
}

El enfoque estándar.

Intent i = new Intent(this, ActivityTwo.class);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
String getrec=textView.getText().toString();
Bundle bundle = new Bundle();
bundle.putString(“stuff”, getrec);
i.putExtras(bundle);
startActivity(i);

Ahora en tu segunda actividad recupera tus datos del paquete:

Obtener el paquete

Bundle bundle = getIntent().getExtras();

Extraer los datos ...

String stuff = bundle.getString(“stuff”); 

El paso de datos entre actividades es principalmente por medio de un objeto de intención.

Primero, debe adjuntar los datos al objeto de intento con el uso de la clase Bundle . Luego, llame a la actividad usando los startActivity() o startActivityForResult() .

Puede encontrar más información al respecto, con un ejemplo de la publicación del blog Pasar datos a una actividad .


Esta es mi mejor práctica y ayuda mucho cuando el proyecto es enorme y complejo.

Supongamos que tengo 2 actividades, LoginActivity y LoginActivity . Quiero pasar 2 parámetros (nombre de usuario y contraseña) de LoginActivity a LoginActivity .

Primero, creo mi HomeIntent

public class HomeIntent extends Intent {

    private static final String ACTION_LOGIN = "action_login";
    private static final String ACTION_LOGOUT = "action_logout";

    private static final String ARG_USERNAME = "arg_username";
    private static final String ARG_PASSWORD = "arg_password";


    public HomeIntent(Context ctx, boolean isLogIn) {
        this(ctx);
        //set action type
        setAction(isLogIn ? ACTION_LOGIN : ACTION_LOGOUT);
    }

    public HomeIntent(Context ctx) {
        super(ctx, HomeActivity.class);
    }

    //This will be needed for receiving data
    public HomeIntent(Intent intent) {
        super(intent);
    }

    public void setData(String userName, String password) {
        putExtra(ARG_USERNAME, userName);
        putExtra(ARG_PASSWORD, password);
    }

    public String getUsername() {
        return getStringExtra(ARG_USERNAME);
    }

    public String getPassword() {
        return getStringExtra(ARG_PASSWORD);
    }

    //To separate the params is for which action, we should create action
    public boolean isActionLogIn() {
        return getAction().equals(ACTION_LOGIN);
    }

    public boolean isActionLogOut() {
        return getAction().equals(ACTION_LOGOUT);
    }
}

Aquí es cómo paso los datos en mi LoginActivity

public class LoginActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);

        String username = "phearum";
        String password = "pwd1133";
        final boolean isActionLogin = true;
        //Passing data to HomeActivity
        final HomeIntent homeIntent = new HomeIntent(this, isActionLogin);
        homeIntent.setData(username, password);
        startActivity(homeIntent);

    }
}

Paso final, aquí es cómo recibo los datos en HomeActivity

public class HomeActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_home);

        //This is how we receive the data from LoginActivity
        //Make sure you pass getIntent() to the HomeIntent constructor
        final HomeIntent homeIntent = new HomeIntent(getIntent());
        Log.d("HomeActivity", "Is action login?  " + homeIntent.isActionLogIn());
        Log.d("HomeActivity", "username: " + homeIntent.getUsername());
        Log.d("HomeActivity", "password: " + homeIntent.getPassword());
    }
}

¡Hecho! Genial :) Solo quiero compartir mi experiencia. Si estás trabajando en un proyecto pequeño, este no debería ser el gran problema. Pero cuando estás trabajando en un gran proyecto, realmente te duele cuando quieres refactorizar o corregir errores.


Iniciar otra actividad desde esta actividad. Pasar parámetros a través de Bundle Object.

Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("USER_NAME", "[email protected]");
startActivity(intent);

Recuperar en otra actividad (YourActivity)

String s = getIntent().getStringExtra("USER_NAME");

Esto está bien para el tipo de datos de tipo simple. Pero si desea pasar datos complejos entre la actividad, primero debe serializarlos.

Aquí tenemos modelo de empleado

class Employee{
    private String empId;
    private int age;
    print Double salary;

    getters...
    setters...
}

Puede usar Gson lib proporcionado por google para serializar los datos complejos como este

String strEmp = new Gson().toJson(emp);
Intent intent = new Intent(getBaseContext(), YourActivity.class);
intent.putExtra("EMP", strEmp);
startActivity(intent);

Bundle bundle = getIntent().getExtras();
String empStr = bundle.getString("EMP");
            Gson gson = new Gson();
            Type type = new TypeToken<Employee>() {
            }.getType();
            Employee selectedEmp = gson.fromJson(empStr, type);

La forma más fácil de hacer esto sería pasar el ID de sesión a la actividad de cierre de sesión en la Intent que está utilizando para iniciar la actividad:

Intent intent = new Intent(getBaseContext(), SignoutActivity.class);
intent.putExtra("EXTRA_SESSION_ID", sessionId);
startActivity(intent);

Accede a esa intención en la siguiente actividad.

String sessionId= getIntent().getStringExtra("EXTRA_SESSION_ID");

La docs para intenciones tiene más información (consulte la sección titulada "Extras").


Me ayuda a ver las cosas en contexto. Aquí hay dos ejemplos.

Pasando los datos hacia adelante

Actividad principal

  • Coloque los datos que desea enviar en un Intent con un par clave-valor. Vea esta respuesta para las convenciones de nomenclatura para la clave.
  • Comience la segunda actividad con startActivity .

MainActivity.java

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // get the text to pass
        EditText editText = (EditText) findViewById(R.id.editText);
        String textToPass = editText.getText().toString();

        // start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra(Intent.EXTRA_TEXT, textToPass);
        startActivity(intent);
    }
}

Segunda actividad

  • Utiliza getIntent() para obtener la Intent que inició la segunda actividad. Luego puede extraer los datos con getExtras() y la clave que definió en la primera actividad. Como nuestros datos son una cadena, solo usaremos getStringExtra aquí.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);

        // get the text from MainActivity
        Intent intent = getIntent();
        String text = intent.getStringExtra(Intent.EXTRA_TEXT);

        // use the text in a TextView
        TextView textView = (TextView) findViewById(R.id.textView);
        textView.setText(text);
    }
}

Pasando datos de vuelta

Actividad principal

  • Comience la segunda actividad con startActivityForResult , proporcionándole un código de resultado arbitrario.
  • Anular onActivityResult . Esto se llama cuando la segunda actividad termina. Puede asegurarse de que en realidad es la Segunda Actividad verificando el código de resultado. (Esto es útil cuando está iniciando varias actividades diferentes desde la misma actividad principal).
  • Extrae los datos que obtuviste de la Intent devolución. Los datos se extraen utilizando un par clave-valor. Podría usar cualquier cadena para la clave, pero Intent.EXTRA_TEXT el Intent.EXTRA_TEXT predefinido ya que estoy enviando texto.

MainActivity.java

public class MainActivity extends AppCompatActivity {

    private static final int SECOND_ACTIVITY_REQUEST_CODE = 0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    // "Go to Second Activity" button click
    public void onButtonClick(View view) {

        // Start the SecondActivity
        Intent intent = new Intent(this, SecondActivity.class);
        startActivityForResult(intent, SECOND_ACTIVITY_REQUEST_CODE);
    }

    // This method is called when the second activity finishes
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // check that it is the SecondActivity with an OK result
        if (requestCode == SECOND_ACTIVITY_REQUEST_CODE) {
            if (resultCode == RESULT_OK) {

                // get String data from Intent
                String returnString = data.getStringExtra(Intent.EXTRA_TEXT);

                // set text view with string
                TextView textView = (TextView) findViewById(R.id.textView);
                textView.setText(returnString);
            }
        }
    }
}

Segunda actividad

  • Coloque los datos que desea enviar a la actividad anterior en una Intent . Los datos se almacenan en la Intent utilizando un par clave-valor. Elegí usar Intent.EXTRA_TEXT para mi clave.
  • Establezca el resultado en RESULT_OK y agregue la intención que contiene sus datos.
  • Llame a finish() para cerrar la segunda actividad.

SecondActivity.java

public class SecondActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_second);
    }

    // "Send text back" button click
    public void onButtonClick(View view) {

        // get the text from the EditText
        EditText editText = (EditText) findViewById(R.id.editText);
        String stringToPassBack = editText.getText().toString();

        // put the String to pass back into an Intent and close this activity
        Intent intent = new Intent();
        intent.putExtra(Intent.EXTRA_TEXT, stringToPassBack);
        setResult(RESULT_OK, intent);
        finish();
    }
}

Pasar Intent extras es un buen enfoque como señaló Erich.

Sin embargo, el objeto Application es otra forma, y ​​a veces es más fácil cuando se trata del mismo estado en múltiples actividades (en lugar de tener que ponerlo en cualquier lugar), u objetos más complejos que los primitivos y las Cadenas.

Puede extender la Aplicación, y luego configurar / obtener lo que quiera allí y acceder a ella desde cualquier Actividad (en la misma aplicación) con getApplication() .

También tenga en cuenta que otros enfoques que puede ver, como los estáticos, pueden ser problemáticos porque pueden provocar pérdidas de memoria . La aplicación ayuda a resolver esto también.


Prueba esto:

CurrentActivity.java

Intent intent = new Intent(currentActivity.this, TargetActivity.class);
intent.putExtra("booktype", "favourate");
startActivity(intent);

TargetActivity.java

Bundle b = getIntent().getExtras();
String typesofbook = b.getString("booktype");

Puede probar la Preferencia compartida, puede ser una buena alternativa para compartir datos entre las actividades

Para guardar ID de sesión -

SharedPreferences pref = myContexy.getSharedPreferences("Session 
Data",MODE_PRIVATE);
SharedPreferences.Editor edit = pref.edit();
edit.putInt("Session ID", session_id);
edit.commit();

Para conseguirlos -

SharedPreferences pref = myContexy.getSharedPreferences("Session Data", MODE_PRIVATE);
session_id = pref.getInt("Session ID", 0);

Puedes usar Intent

Intent mIntent = new Intent(FirstActivity.this, SecondActivity.class);
mIntent.putExtra("data", data);
startActivity(mIntent);

Otra forma podría ser usando el patrón singleton también:

public class DataHolder {

 private static DataHolder dataHolder;
 private List<Model> dataList;

 public void setDataList(List<Model>dataList) {
    this.dataList = dataList;
 }

 public List<Model> getDataList() {
    return dataList;
 }

 public synchronized static DataHolder getInstance() {
    if (dataHolder == null) {
       dataHolder = new DataHolder();
    }
    return dataHolder;
 }
}

De tu primera actividad

private List<Model> dataList = new ArrayList<>();
DataHolder.getInstance().setDataList(dataList);

En la segunda actividad

private List<Model> dataList = DataHolder.getInstance().getDataList();

Solo tienes que enviar extras al llamar tu intención.

Me gusta esto:

Intent intent = new Intent(getApplicationContext(), SecondActivity.class);
intent.putExtra("Variable name", "Value you want to pass");
startActivity(intent);

Ahora, en el método OnCreate de tu SecondActivity puedes obtener los extras como este.

Si el valor que enviaste fue long :

long value = getIntent().getLongExtra("Variable name which you sent as an extra", defaultValue(you can give it anything));

Si el valor que enviaste fue una String :

String value = getIntent().getStringExtra("Variable name which you sent as an extra");

Si el valor que enviaste fue un Boolean :

Boolean value = getIntent().getBooleanExtra("Variable name which you sent as an extra", defaultValue);

También puede pasar objetos de clase personalizados haciendo una clase parcelable . La mejor manera de hacer que sea parcelable es escribir su clase y luego pegarlo en un sitio como http://www.parcelabler.com/ . Haga clic en construir y obtendrá nuevo código. Copia todo esto y reemplaza el contenido de la clase original. Entonces-

Intent intent = new Intent(getBaseContext(), NextActivity.class);
Foo foo = new Foo();
intent.putExtra("foo", foo);
startActivity(intent);

y obtener el resultado en NextActivity como-

Foo foo = getIntent().getExtras().getParcelable("foo");

Ahora puedes simplemente usar el objeto foo como habrías usado.


Trate de hacer lo siguiente:

Cree una clase simple de "ayudante" (fábrica para sus intenciones), como esta:

import android.content.Intent;

public class IntentHelper {
    public static final Intent createYourSpecialIntent(Intent src) {
          return new Intent("YourSpecialIntent").addCategory("YourSpecialCategory").putExtras(src);
    }
}

Esta será la fábrica para todos sus intentos. Cada vez que necesite un nuevo Intent, cree un método de fábrica estático en IntentHelper. Para crear una nueva intención, solo debes decirlo así:

IntentHelper.createYourSpecialIntent(getIntent());

En tu actividad. Cuando desee "guardar" algunos datos en una "sesión", use lo siguiente:

IntentHelper.createYourSpecialIntent(getIntent()).putExtra("YOUR_FIELD_NAME", fieldValueToSave);

Y envía este intento. En la Actividad objetivo su campo estará disponible como:

getIntent().getStringExtra("YOUR_FIELD_NAME");

Así que ahora podemos usar Intent como la misma sesión anterior (como en servlets o JSP ).


Utilizo campos estáticos en una clase, y los obtengo / configuro:

Me gusta:

public class Info
{
    public static int ID      = 0;
    public static String NAME = "TEST";
}

Para obtener un valor, use esto en una actividad:

Info.ID
Info.NAME

Para establecer un valor:

Info.ID = 5;
Info.NAME = "USER!";

De la actividad

 int n= 10;
 Intent in = new Intent(From_Activity.this,To_Activity.class);
 Bundle b1 = new Bundle();
 b1.putInt("integerNumber",n);
 in.putExtras(b1);
 startActivity(in);

A la actividad

 Bundle b2 = getIntent().getExtras();
 int m = 0;
 if(b2 != null)
  {
     m = b2.getInt("integerNumber");
  }

Puede pasar datos entre actividades en la aplicación de 3 maneras 1.Intent 2.SharedPreferences 3.Application

los datos que se pasan con intención tienen algún límite. Para una gran cantidad de datos, puede usar el uso compartido de datos a nivel de la aplicación y al almacenarlo en la preferencia compartida aumenta el tamaño de la aplicación


Recientemente lancé Vapor API , un framework para Android con sabor a jQuery que simplifica todo tipo de tareas como esta. Como se mencionó, SharedPreferenceses una forma de hacer esto.

VaporSharedPreferencesse implementa como Singleton, por lo que es una opción, y en la API de Vapor tiene un .put(...)método muy sobrecargado para que no tenga que preocuparse explícitamente por el tipo de datos que está confirmando, siempre que sea compatible. También es fluido, por lo que puede encadenar llamadas:

$.prefs(...).put("val1", 123).put("val2", "Hello World!").put("something", 3.34);

Opcionalmente, también guarda los cambios automáticamente y unifica el proceso de lectura y escritura bajo el capó para que no tenga que recuperar explícitamente un Editor como lo hace en Android estándar.

Alternativamente, usted podría usar una Intent. En la API de Vapor también puede usar el .put(...)método sobrecargado de chainable en un VaporIntent:

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

Y pasarlo como extra, como se menciona en las otras respuestas. Puede recuperar extras de su Activity, y además, si está usando VaporActivityesto, se hace por usted automáticamente para que pueda usar:

this.extras()

Para recuperarlos en el otro extremo Activity, cambie a.

Espero que sea de interés para algunos :)


/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}




android-activity