我正在尝试在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);
答案 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是我的最后选择喜欢。