8

I have an application which consists of two activities/screens and a java class from which i create objects.

I need to use an object I created on the first activity (instanciating the .java class) on the second activity.

What is the simplest way to do this? I googled about it and implementing the Parcelable interface on the java class seems to be the most common answer to this problem. But the object is kind of complex and parceling every single member of it seems like a brute-force solution.

Isn't there an elegant solution to this?

Thanks

EDIT: Is storing the object data on a simple SQlite database a solution?

tyb
  • 4,749
  • 11
  • 31
  • 38

4 Answers4

3

You could use the application context (although this is basically storing global state so you need to be careful how you're using it):

Using Application context everywhere?

Community
  • 1
  • 1
Abdullah Jibaly
  • 53,220
  • 42
  • 124
  • 197
  • +1, This is also my method of choice. Very flexible as you can write your own getters an setters in a custom Application class. – Guillaume Jan 18 '12 at 01:15
1

One of the easiest ways to pass information between activities is to use Bundles.

You can add extras to an Intent before launching a new Activity.

On the other end (the other activity) you can then receive these extras out of the Bundle and possibly rebuilt the Object in the new activity..

Here's an Example:

First of all, here's the Student Class:

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

The Main Activity will reference the Student class to generate an object s

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

Here's the XML that is tied to the Student Class:

Main XML Layout - 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>

Note that the NewActivity accesses the information from a Bundle (named infoBundle in this case)..

The object is "rebuilt" programmatically as if it was passed.

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

Don't forget to add the new activity to your Manifest!

Android Manifest - 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>

Sorry for the mix of XML and Programmatic Scripting, I realized after the first Activity that it would be a lot of files to display so I condensed the last file, but you should be able to get the idea..

Hope this helps!

DizzyThermal
  • 104
  • 1
  • 10
0

I think Singleton is the right way to create an object accessible in all activities. It's a kind of object that only can be created once, and if you try to access it again it will return the existing instance of the object. See this answer for more information about how it works.

karel
  • 5,489
  • 46
  • 45
  • 50
Mario Kutlev
  • 4,897
  • 7
  • 44
  • 62
0
class Bike{
private static int id;
public static int getId() 
{
    return id;
}
public static void setId(int id) 
{
    Bike.id = id;
}
public static String getName() 
{
    return name;
}

public static void setName(String name)
{
    Bike.name = name;
}
private static String name;

 }


 class Honda4 {

 public static void main(String args[]){

     Bike.setName("Duraivel");
     Bike.setId(1);
     GetValue g = new GetValue();

 }
 }

 class GetValue
 {
     {
         System.out.print("Bike Name"+ Bike.getName());
         System.out.print("Bike ID "+ Bike.getId()); 
     }
 }