我的问题是我的两个活动GameActivity
和StoreActivity
应该共享相同的Player
,并且应该看到在任何Player
中对Activity
所做的每一次更改在所有活动中,但是当我在Upgrade
中购买StoreActivity
并从StoreActivity
更改时,对象的状态是购买前的状态。Player
是Serializable
。>
OnClickListener
来自StoreActivity
:
LIST_VIEW.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Upgrade upgrade = (Upgrade)LIST_VIEW.getAdapter().getItem(position);
if(upgrade.getCost() > player.getMoney()) {
LIST_VIEW.getChildAt(position).setEnabled(false);
} else {
player.buyUpgrade(upgrade);
CURRENT_MONEY.setText(getString(R.string.current_money) + player.getMoney());
//Notify GameActivity, but how?
}
}
});
答案 0 :(得分:0)
android.app.Activity
类具有一个onResume()
方法。
活动返回与用户的互动时将调用它。
非常适合您的用例,因为当用户想要返回时,GameActivity
将被暂停并且onResume()
被调用。
您可以这样实现:
public class GameActivity extends AppCompatActivity {
@Override
protected void onResume() {
super.onResume();
//refreshing changed list items
}
}
答案 1 :(得分:0)
您可以通过扩展Player
类并将实例存储在其中来将Application
对象绑定到应用程序生命周期。它将使您可以在每个活动的生命周期中对其进行引用,而不会泄漏。您可以检查它的值并显示一些负载,并在设置时创建回调,以便可以通知所有活动。
这个很棒的Codepath article解释了如何做到这一点。
您的主应用程序可能如下所示:
public class MyCustomApplication extends Application {
private Player player;
private ArrayList<WeakReference<OnPlayerSetCallback>> callbacks;
public void addCallback(WeakReference<OnPlayerSetCallback> callbackRef) {
this.callbacks.add(callbackRef);
}
public void removeCallback(WeakReference<OnPlayerSetCallback> callbackRef) {
this.callback.remove(callbackRef);
}
public void setPlayer(Player player) {
this.player = player;
for (WeakReference<OnPlayerSetCallback> callbackRef : callbacks) {
OnPlayerSetCallback callback = callbackRef.get();
if (callback == null) {
// remove invalid callback references (if an activity was destroyed, for example)
callbacks.remove(callbackRef);
} else {
// notify activities that a player was set
callback.onPlayerSet(player);
}
}
}
public Player getPlayer() {
return this.player;
}
interface OnPlayerSetCallback {
Player onPlayerSet();
}
}
更新播放器应该不是问题,因为每个活动都将使用相同的实例。但是,如果您需要在没有任何生命周期的情况下更新UI的情况下,可以在回调中创建更新侦听器。
答案 2 :(得分:0)
您可以使用 Singleton 设计模式。
您可以在 PlayerRepository 中使用 player 字段创建一个对象,然后在您的应用中每次都可以获取该对象 您想更改它。
[date* date-from id:date-from] and `[date* date-to id:date-to]`
在您的活动中
public class PlayerRepository {
private Player player;
private static final PlayerRepository ourInstance = new PlayerRepository();
public static PlayerRepository getInstance() {
return ourInstance;
}
private PlayerRepository() {
}
public void setPlayer(Player player)
{
this.player=player;
}
public Player getPlayer()
{
retrun this.player;
}
}