【问题标题】:Passing Data from multiple Activities to a single activity将数据从多个活动传递到单个活动
【发布时间】:2013-06-07 14:05:37
【问题描述】:

大家好,

&nbsp&nbsp&nbsp&nbsp我有一个应用程序,我和几个同学为一个班级项目做的。我们现在正在继续该应用程序以改进和简化它。这是我到目前为止所拥有的:

  • 闪屏
  • 主页
  • 第 1 - 18 洞
  • 分数页
  • 关于页面

主屏幕孔 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);
}

提前致谢。

【问题讨论】:

    标签: android pass-data


    【解决方案1】:

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

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

    如果您不需要保留数据,那么我会像您现在一样继续按原样将数据从 Activity 传递到 Activity。这对您来说可能看起来“草率”,但这是您应该在活动之间传递数据的方式。

    也许为您想要传递的数据创建一个对象并让它实现 Parcelable 接口会减少它在您眼中的“草率”。这是指向tutorial for Parcelable 对象的链接。

    另一种选择是使用已经建议的全局应用程序上下文,但请注意它会带来一个大问题 - 如果应用程序在后台被终止,则存储在应用程序类中的任何数据都会丢失,因此您必须考虑发生这种情况。

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

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

    【讨论】:

    • 感谢 triggs 和所有其他人的有用建议。我将研究这些推荐的选项。至于乐谱的存储寿命,它基本上是一个临时显示,我稍后会添加一个保存功能。保存功能会将其保存到“排名”页面或作为手机屏幕截图。再次感谢大家!
    【解决方案2】:

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

    SQLite Docs

    Android Notepad Tutorial is good for SQLite example as well

    【讨论】:

      【解决方案3】:

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

      根据需要从任何 Activity 写入。

      ScorePage Activity 中读取它。

      更多详细信息和示例可在此处获得:(Using the Android Application class to persist data)

      【讨论】:

        猜你喜欢
        • 2020-03-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 2019-06-14
        • 1970-01-01
        相关资源
        最近更新 更多