2012-01-18 14 views
6

Tengo una aplicación que consta de dos actividades/pantallas y una clase de Java desde la cual creo objetos.¿Cómo hacer que un objeto sea accesible para todas las actividades en un programa de Android?

Necesito usar un objeto que creé en la primera actividad (instanciando la clase .java) en la segunda actividad.

¿Cuál es la forma más sencilla de hacerlo? Lo busqué en Google y la implementación de la interfaz Parcelable en la clase Java parece ser la respuesta más común a este problema. Pero el objeto es algo complejo y parcelar cada miembro parece una solución de fuerza bruta.

¿No hay una solución elegante para esto?

Gracias

EDIT: es el almacenamiento de los datos de objeto en una base de datos SQLite una solución sencilla?

Respuesta

3

Usted podría utilizar el contexto de aplicación (aunque esto es, básicamente, almacenando el estado global por lo que deberá tener cuidado de cómo se está usando):

Using Application context everywhere?

+0

+1, este es también mi método de elección. Muy flexible ya que puede escribir sus propios getters y setters en una clase de aplicación personalizada. – Guillaume

2

Una de las maneras más fáciles de pasar información entre actividades es usar Bundles.

Puede agregar extras a una intención antes de iniciar una nueva actividad.

En el otro extremo (la otra actividad) a continuación, puede recibir estos extras fuera del paquete y, posiblemente, reconstruida del objeto en la nueva actividad ..

He aquí un ejemplo:

primer todo, aquí está la clase del alumno:

Clase del estudiante - Student.java:

package com.stephendiniz.objectsharing; 

public class Student 
{ 
    int id; 
    String name; 
    String profession; 

    Student() 
    { 
     id = 0; 
     name = ""; 
     profession = ""; 
    } 

    Student(int id, String name, String profession) 
    { 
     this.id = id; 
     this.name = name; 
     this.profession = profession; 
    } 

    public int getId()    { return id; } 
    public String getName()   { return name; } 
    public String getProfession() { return profession; } 
} 

La actividad principal se referirá a la clase del estudiante para generar un objeto s

Actividad Principal - AndroidObjectSharing.java:

package com.stephendiniz.objectsharing; 

import android.app.Activity; 
import android.content.Intent; 
import android.os.Bundle; 
import android.view.View; 
import android.widget.Button; 
import android.widget.TextView; 

public class AndroidObjectSharingActivity extends Activity 
{ 
    TextView id; 
    TextView name; 
    TextView profession; 

    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     id = (TextView)findViewById(R.id.id); 
     name = (TextView)findViewById(R.id.name); 
     profession = (TextView)findViewById(R.id.profession); 

     Button submitButton = (Button)findViewById(R.id.submitButton); 
     submitButton.setOnClickListener(new View.OnClickListener() 
      { 
      final Intent newActivity = new Intent(AndroidObjectSharingActivity.this, NewActivity.class); 
       public void onClick(View v) 
       { 
        Student s = new Student(Integer.parseInt(id.getText().toString()), name.getText().toString(), profession.getText().toString()); 
        newActivity.putExtra("extraStudentId", s.getId()); 
        newActivity.putExtra("extraStudentName", s.getName()); 
        newActivity.putExtra("extraStudentProfession", s.getProfession()); 

        startActivity(newActivity); 
       } 
      }); 
    } 
} 

Aquí es el código XML que está ligado a la clase del alumno:

Diseño XML principal - main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" > 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Student ID:" /> 
    <EditText 
     android:id="@+id/id" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="9001" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Student Name:" /> 
    <EditText 
     android:id="@+id/name" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Steve" /> 

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:text="Student Profession:" /> 
    <EditText 
     android:id="@+id/profession" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:text="Computer Engineer" /> 

    <Button 
     android:id="@+id/submitButton" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_gravity="center" 
     android:layout_marginTop="30dp" 
     android:text="Send to New Activity" /> 

</LinearLayout> 

Tenga en cuenta que la NewActivity accede a la información de un paquete (llamado infoBundle en este caso) ..

El objeto es "reconstruyeron" mediante programación como si fue aprobada.

Nueva actividad - NewActivity.java:

package com.stephendiniz.objectsharing; 

import android.app.Activity; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import android.widget.LinearLayout; 
import android.widget.TextView; 

public class NewActivity extends Activity 
{ 
     LinearLayout ll; 

     TextView id; 
     TextView name; 
     TextView profession; 

     private final static String TAG = "NewActivity"; 
    @Override 
    public void onCreate(Bundle savedInstanceState) 
    { 
     super.onCreate(savedInstanceState); 

     Bundle infoBundle = getIntent().getExtras(); 
     Student s = new Student(infoBundle.getInt("extraStudentId"), infoBundle.getString("extraStudentName"), infoBundle.getString("extraStudentProfession")); 

     ll = new LinearLayout(this); 
     ll.setOrientation(LinearLayout.VERTICAL); 

     id = new TextView(this); 
     name = new TextView(this); 
     profession = new TextView(this); 

     id.setText("Student Id: " + s.getId() + "\n"); 
     name.setText("Student Name: " + s.getName() + "\n"); 
     profession.setText("Student Profession: " + s.getProfession() + "\n"); 

     ll.addView(id); 
     ll.addView(name); 
     ll.addView(profession); 

     Button closeButton = new Button(this); 
     closeButton.setText("Close Activity"); 
     closeButton.setOnClickListener(new View.OnClickListener() 
      { 
       public void onClick(View v) 
       { 
        finish(); 
       } 
      }); 

     ll.addView(closeButton); 

     setContentView(ll); 
    } 
} 

No se olvide de añadir la nueva actividad a su Manifiesto!

Android Manifiesto - AndroidManifest.xml:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.stephendiniz.objectsharing" 
    android:versionCode="1" 
    android:versionName="1.0" > 

    <uses-sdk android:minSdkVersion="15" /> 

    <application 
     android:icon="@drawable/ic_launcher" 
     android:label="@string/app_name" > 
     <activity 
      android:name=".AndroidObjectSharingActivity" 
      android:label="@string/app_name" > 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
     <activity 
      android:name=".NewActivity" 
      android:label="New Activity" /> 
    </application> 

</manifest> 

Lo siento por la combinación de secuencias de comandos XML y programático, se dio cuenta de que después de la primera actividad que sería una gran cantidad de archivos para mostrar así que condensa la último archivo, pero debería poder obtener la idea ..

Espero que esto ayude!

0

Creo que Singleton es la forma correcta de crear un objeto accesible en todas las actividades. Consulte this respuesta para obtener más información acerca de cómo funciona.

Cuestiones relacionadas