【问题标题】:How would I pass an object to a new activity, modify that object, and update the changes in the first activity? [duplicate]如何将对象传递给新活动、修改该对象并更新第一个活动中的更改? [复制]
【发布时间】:2019-04-26 12:16:34
【问题描述】:

我正在尝试在 Android Studio 中制作一种空闲 RPG 游戏。您的英雄具有一些属性,例如经验、等级、生命值、金币等。

我有显示名称、XP 和级别的主屏幕。然后我想打开另一个活动并更改 XP,当我回到第一个屏幕时,XP 也会在那里更新。

我该怎么做呢?

我通过将 Hero 对象设置为 Singleton 来实现它。然而,这给我带来了一些设计问题,所以我更愿意使用另一种方法。

我也尝试过使用意图传递对象,但它似乎没有更新主要活动中的更改。到目前为止,它只是在第二个活动中更新对象的属性,但是当我关闭该活动时,任何更改都不会保存 - 即使我再次打开活动。

我在开发 Android 应用方面不是很有经验,所以我可能做错了什么。任何帮助将不胜感激!

Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("hero", hero);
        startActivity(intent);
Hero hero = (Hero) getIntent().getSerializableExtra("hero");
hero.incxp();

【问题讨论】:

  • 你不要在Activities之间传递这样的对象,你应该有一个数据层,一个像DataContext这样的类,你在其中存储对象给我修改,然后Activity可以从这个DataContext类中读取对象

标签: java android


【解决方案1】:

您应该使用 startActivityForResult 将您的对象发送到第二个 Activity。在第二个活动中更新您的值后,将对象传递回第一个活动并使用它来更新您的值。 在第一个活动中:

Intent intent = new Intent(this, SecondActivity.class);
    intent.putExtra("hero", hero);
    startActivityForResult(intent,101);

在第二个活动中:

Hero hero = (Hero) getIntent().getSerializableExtra("hero");
hero.incxp();
Intent returnIntent = new Intent();
returnIntent.putExtra("hero",result);
setResult(Activity.RESULT_OK,returnIntent);
finish();

再次回到第一个活动,覆盖您的 onActivityResultMethod 以取回值:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == 101) {
    if(resultCode == Activity.RESULT_OK){
        Hero hero = (Hero) data.getSerializableExtra("hero");
        // update views with your new hero object
    }

}
}

【讨论】:

  • 嗨,Mathew,非常感谢您的回答 - 我使用这种方法让它工作,您完美地回答了我的问题,所以我只想说我很感谢您的回复。
  • 很高兴能帮上忙。
【解决方案2】:

在您的第一个活动中:

Intent i = new Intent(this, SecondActivity.class);
i.putSerializableExtra("thing",thing);
startActivityForResult(i, 1);

然后在您的第二个活动中获取您刚刚发送的对象:

myThing = getIntent().getSerializableExtra("thing");

并对其进行更改。还要确保getIntent() != null,否则会崩溃。

并在您关闭此活动时发回数据:

Intent returnIntent = new Intent();
returnIntent.putSerializableExtra("result", myThing);
setResult(Activity.RESULT_OK,returnIntent);
finish();

然后在您的第一个活动中,您可以覆盖此方法:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {

if (requestCode == 1) {
    if(resultCode == Activity.RESULT_OK){
        MyObjectType result=data.getSerializableExtra("result");
    }
    if (resultCode == Activity.RESULT_CANCELED) {
        //Write your code if there's no result
    }
}
}//onActivityResult

【讨论】:

    【解决方案3】:

    首先,如果你想让变量在杀死应用程序或类似的东西后消失,然后使用静态变量。所以,它可以在所有类中访问。

    public static String OBJ= obj;
    

    您可以更改任何类的变量。但这不是可取的,因为如果处理不当可能会发生许多竞争条件。

    如果您不希望它在杀死应用程序后仍然存在,您可以通过序列化对象在 android 中使用 Shared Preferences。

    Gson gson = new Gson();
    String json = gson.toJson(simDetails);
    
    SharedPreferences prefs = PreferenceManager
                .getDefaultSharedPreferences(context);
    Editor e = prefs.edit();
    e.putString(key, json);
    e.commit();
    

    使用首选项是比使用静态变量最好的方法。

    也可以传递意图,但这不是最好的方法,因为更新需要时间,而且这也容易出现竞争条件。最好的方法是首选项,如果不是静态变量。使用意图是我最后的选择喜欢。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-10-08
      • 1970-01-01
      • 2020-05-05
      • 1970-01-01
      • 2012-01-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多