如何将对象传递给新活动,修改该对象并更新第一个活动中的更改?

时间:2019-04-26 12:16:34

标签: java android

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

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

我该怎么做?

我通过使Hero对象成为Singleton使其起作用。但是,这给我带来了一些设计上的问题,因此,我宁愿使用另一种方法。

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

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

$period = ($value["period"] instanceof DateTime) ? $value["period"]->format('Y-m-d H:i:s') : null;
Intent intent = new Intent(this, SecondActivity.class);
        intent.putExtra("hero", hero);
        startActivity(intent);

3 个答案:

答案 0 :(得分: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
    }

}
}

答案 1 :(得分:0)

在您的第一次活动中:

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

答案 2 :(得分:0)

首先,如果要在终止应用程序或类似操作后使变量消失,请使用静态变量。因此,在所有类中都可以使用该变量。

public static String OBJ= obj;

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

如果您不希望它在终止应用程序后仍然保留,则可以通过序列化对象在android中使用“共享首选项”。

Gson gson = new Gson();
String json = gson.toJson(simDetails);

SharedPreferences prefs = PreferenceManager
            .getDefaultSharedPreferences(context);
Editor e = prefs.edit();
e.putString(key, json);
e.commit();

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

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