2011-03-30 43 views
0

我有一个包含数据列表(TextView)的活动,我需要保存此列表中已选择的数据(onClick)能够在另一个活动(历史)中获得并阅读它保存来自活动(A)的数据并在另一活动(历史记录)中读取

我知道存在“可序列化”的可能性,但我没有成功了解它如何能帮助我。

如果有人能为我澄清这个问题,我会很高兴,例如?

谢谢你的帮助!

回答

0

如果你想一个String传递到另一个活动,你可以用putExtragetStringExtra做到这一点:

Intent intent = new Intent(this, OtherActivity.class); 
intent.putExtra("parameter", myStringParameter); 
startActivity(intent); 

然后在OtherActivityonCreate方法中读取它:

String parameter = getIntent().getStringExtra("parameter"); 

Serializable接口对编组更复杂的对象很有用;如果你只是处理String,你不需要这个。

编辑 - 如果你需要存储少量数据的持续,您可以使用SharedPreferences

final String TAG = "MyApplication"; 
SharedPreferences prefs = getSharedPreferences(TAG, MODE_PRIVATE); 
prefs.edit().putString("parameter", myStringParameter).commit(); 

,然后阅读喜好:

final String TAG = "MyApplication"; 
SharedPreferences prefs = getSharedPreferences(TAG, MODE_PRIVATE); 
String parameter = prefs.getString("parameter", null); 

这些数据将提供甚至在您的应用程序关闭后。

+0

它不是为我好,因为我需要保存您的使用情况最好数据即使在应用程序关闭时。 – dirko 2011-03-30 19:44:07

+0

我加了'SharedPreferences'方法,它可以让你持久地存储数据。 – 2011-03-30 19:49:30

0

是的,使用实现Serializable的类。见我的回答这个问题:How to pass several variables of different types from one function to another on android?

创建一个将容纳一些数据模型类:

public class Page implements Serializable { 
    private String name; 
    private String description; 
    //and so on... 
    public Page(String name, String description) { 
     this.name = name; 
     this.description = description; 
    } 
    public String getName() { 
     return name; 
    } 
    public String getDescription() { 
     return description; 
    } 
} 

现在你可以创建一个Page对象,并通过构造数据(名称,描述)填充它。可以选择制作一些制作者。

Page p = new Page("James", "Hello World"); 
startActivity(new Intent(context, MyActivity.class).putExtra("Page", p)); 

检索MyActivityPage在其onCreate方法:

Page p = (Page)getIntent().getExtras().getSerializable("Page"); 
Toast.makeText(this, "Name: " + p.getName() + ", Description:" + p.getDescription(), Toast.LENGTH_LONG).show(); 
0

在活动(消息传递)之间发送不可变状态对象值得称赞,恕我直言。可以说OOP是关于消息传递的,而不是对象。两点建议。 1)使用完全限定名称名称:值对这样做的:

private void launchManagePassword() { 
    Intent i= new Intent(this, ManagePassword.class); // no param constructor 
    PasswordState outState= new PasswordState(lengthKey,timeExpire,isValidKey,timeoutType,"",model.getIsHashPassword()); 
    Bundle b= new Bundle(); 
    b.putSerializable("jalcomputing.confusetext.PasswordState", outState); 
    i.putExtras(b); 
    startActivityForResult(i,REQUEST_MANAGE_PASSWORD); // used for callback 
} 

这将最大限度地减少运行时转换错误。

2)如果您的应用程序运行良好且对象接口为已稳定请考虑将代码重构为parcel以提高速度。

JAL

编辑:根据要求Code

+0

我真的不明白你的解决方案,你可以带一个例子 – dirko 2011-03-30 19:45:31

+0

@dirko我添加了一个链接到我的答案。它可能比你想要的更多:) – JAL 2011-03-30 22:04:41

0

我知道关于上面提到的方法。但仅仅为了替代想法,既然你提到了历史的话,那么如何使用SQLite来达到这个目的呢? 在第一个活动中,您可以保存数据,并在第二个活动中检索数据。

+0

嗨,你正确的解决方案,但我想知道“可序列化”。 – dirko 2011-03-30 19:42:17

0

您可以通过各种方式在您的活动之间共享数据,具体取决于您需要保存多少数据以及需要保存多长时间的数据。

  1. 意图:有用2-3屏幕
  2. 之间数据的小位转移时
  3. 辛格尔顿/静态数据存储类:有用的各种活动
  4. 之间共享大量数据时
  5. 的SQLite数据库 :大量要共享的数据,也可用于在应用程序启动之间保存相同数据
  6. 共享首选项:少量数据应用程序启动。

对于使用意图,除非该数据超过2-3活动之间共享,其中选项2将是一个更好的解决方案