将多个活动中的数据传递到单个活动

时间:2013-06-07 14:05:37

标签: android pass-data

大家好,

我有一个应用程序,几个同学和我为一个课程项目。我们现在正在继续使用该应用程序来改进和简化它。这是我到目前为止:

  • 闪屏
  • 主页
  • 1至18洞
  • ScorePage
  • AboutPage

主屏幕洞1 - 18分页面关于页面

除了一些小事以外,我几乎已经弄明白了。我现在正在处理的问题是:

将数据从每个孔页传递到乐谱页。

我知道如何将它从一个页面传递到另一个页面,我可以强行使用它,因为这是我最初的方式,但它看起来很草率,如果可能的话我不想这样做。

//Code (partial)

//(From Hole 1)

@Override
public void onClick(View v)
{
    TextView tvScoreLbl = (TextView) findViewById(R.id.scoreLbl);
    tvScoreLbl.setText(String.valueOf(count));

    if(v == findViewById(R.id.btnAdd))
    {
        count++;
        tvScoreLbl.setText(String.valueOf(count));
    }
    else if(v == findViewById(R.id.btnMinus))
    {
        count--;
        tvScoreLbl.setText(String.valueOf(count));
    }
    else if(v == findViewById(R.id.btnPrev))
    {
        Intent i_prev = new Intent(Hole_01.this, HomePage.class);
        startActivity(i_prev);
    }
    else if(v == findViewById(R.id.btnNext))
    {
        Intent i_pass = new Intent(Hole_01.this, ScorePage.class);
        i_pass.putExtra("score1", tvScoreLbl.getText().toString());
        Intent i_next = new Intent(Hole_01.this, Hole_02.class);
        startActivity(i_next);
    }


//(From ScorePage)

String score;
TextView tvScore1 = (TextView) findViewById(R.id.tvScore1);

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

    Button btnHome = (Button) findViewById(R.id.btnHome);
    btnHome.setOnClickListener(this);

    score = getIntent().getExtras().getString("score1");
    tvScore1.setText(score);
}

//(From Hole 1) @Override public void onClick(View v) { TextView tvScoreLbl = (TextView) findViewById(R.id.scoreLbl); tvScoreLbl.setText(String.valueOf(count)); if(v == findViewById(R.id.btnAdd)) { count++; tvScoreLbl.setText(String.valueOf(count)); } else if(v == findViewById(R.id.btnMinus)) { count--; tvScoreLbl.setText(String.valueOf(count)); } else if(v == findViewById(R.id.btnPrev)) { Intent i_prev = new Intent(Hole_01.this, HomePage.class); startActivity(i_prev); } else if(v == findViewById(R.id.btnNext)) { Intent i_pass = new Intent(Hole_01.this, ScorePage.class); i_pass.putExtra("score1", tvScoreLbl.getText().toString()); Intent i_next = new Intent(Hole_01.this, Hole_02.class); startActivity(i_next); } //(From ScorePage) String score; TextView tvScore1 = (TextView) findViewById(R.id.tvScore1); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.scorepage); Button btnHome = (Button) findViewById(R.id.btnHome); btnHome.setOnClickListener(this); score = getIntent().getExtras().getString("score1"); tvScore1.setText(score); }

提前致谢。

3 个答案:

答案 0 :(得分:0)

不是使用putExtra在所有Intent之间传递数据,而是使用一点SQLite DB来存储分数屏幕可以读取的每个活动的结果。

SQLite Docs

Android Notepad Tutorial is good for SQLite example as well

答案 1 :(得分:0)

将所有状态保存在Application类中。

根据需要从任何活动中写入。

ScorePage活动中阅读。

此处提供了更多详细信息和示例:(Using the Android Application class to persist data

答案 2 :(得分:0)

最佳答案取决于您需要将数据保留多长时间。

如果您需要它在很长一段时间(几天/几周)内持续存在,那么使用SQLite将数据存储到内部或外部存储,或者创建一个代表“漏洞页面”中所有数据的自定义对象,序列化该对象并将其写入磁盘。

如果您不需要数据持续存在,那么我将按照您现有的方式进行操作并继续按原样传递数据,从Activity到Activity。它可能看起来“草率”,但它是你应该如何在活动之间传递数据。

也许为你想传递的数据创建一个对象并让它实现Parcelable接口会让你的眼睛不那么“马虎”。这是指向tutorial for Parcelable个对象的链接。

另一种选择是使用已建议的全局应用程序上下文但是要警告它有一个大问题 - 如果应用程序在后台被杀死,那么Application类中存储的任何数据都会丢失,所以你必须要帐户发生这种情况。

如果您只存储一小部分信息,则数据库过多,如果应用程序被操作系统杀死,则应用程序上下文将丢失数据。

因此,如果您希望将数据保留一段时间,请使用序列化来编写对象(如果它只是得分,那么简单的文件IO工作就可以完成工作而无需序列化)。或者,如果您只需要在应用程序运行时(前景或后台)持续存在,则在活动之间传递数据。