如何使Android程序中的所有活动都可以访问对象?

时间:2012-01-18 00:09:41

标签: android oop object parcelable

我有一个应用程序,它包含两个活动/屏幕和一个java类,我可以从中创建对象。

我需要在第二个活动上使用我在第一个活动(实例化.java类)上创建的对象。

最简单的方法是什么?我搜索了它并在java类上实现Parcelable接口似乎是这个问题最常见的答案。但是这个对象有点复杂,它的每一个成员似乎都是一个蛮力的解决方案。

这不是一个优雅的解决方案吗?

由于

编辑:将对象数据存储在简单的SQlite数据库上是一种解决方案吗?

4 个答案:

答案 0 :(得分:3)

您可以使用应用程序上下文(尽管这基本上是存储全局状态,因此您需要小心如何使用它):

Using Application context everywhere?

答案 1 :(得分:1)

在活动之间传递信息的最简单方法之一是使用捆绑

您可以在启动新活动之前将 extras 添加到Intent。

在另一端(另一个活动),您可以从Bundle中接收这些 extras ,并可能在新活动中重建Object ..

这是一个例子:

首先,这是学生班:

学生班 - 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; }
}

主要活动将引用Student类以生成对象 s

主要活动 - 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);
                }
            });
    }
}

这是绑定到学生班的XML:

主XML布局 - 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>

请注意,NewActivity访问来自捆绑的信息(在本例中名为 infoBundle )..

该对象以编程方式“重建”,就好像它已被传递一样。

新活动 - 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);
    }
}

不要忘记将新活动添加到您的清单中!

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>

对于XML和Programmatic Sc​​ripting的混合,很抱歉,我在第一个Activity之后意识到要显示很多文件所以我压缩了最后一个文件,但是你应该能够得到这个想法..

希望这有帮助!

答案 2 :(得分:0)

我认为Singleton是创建可在所有活动中访问的对象的正确方法。它是一种只能创建一次的对象,如果你再次尝试访问它,它将返回该对象的现有实例。有关其工作原理的详情,请参阅this答案。

答案 3 :(得分: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()); 
     }
 }