2016-03-07 39 views
1

编辑:获取参考来自另一活动对象

这是我使用initialize变量activity的布局后的方法在onCreate()方法被加载

private void initializeVariables() { 
    randomButton = (Button) findViewById(R.id.randomButton); 
    gameButton = (Button) findViewById(R.id.gameButton); 
    i = 1; 
    listIndex = 0; 
    nameList = PlayersNames.nameList; 
    villagerBundle = new ArrayList<>(); 
    characters = new ArrayList<Card>(); 
    players = new ArrayList<Player>(); 


    villagerOne = new Villager(); 
    villagerTwo = new Villager(); 
    villagerThree = new Villager(); 
    villagerFour = new Villager(); 
    villagerFive = new Villager(); 

    villagerBundle.add(villagerOne); 
    villagerBundle.add(villagerTwo); 
    villagerBundle.add(villagerThree); 
    villagerBundle.add(villagerFour); 
    villagerBundle.add(villagerFive); 
} 

原来的问题:

我有2个活动在Android。

一个我创建:

public static Villager villagerOne; 

villagerOne = new Villager(); 

然后在其他我应该访问该villagerOnemAlive变量:

villagerOne.getMAlive(); 

作为参考,这些是Card等级:

public class Card { 

//Names 
public String mCharacter; 

//Status 
private boolean mAlive; 
private boolean mDefended; 
private boolean mOwled; 
private boolean mLastSavaged; 
private boolean mLastLynched; 


//Constructor 
public Card(){ 
} 

public void setMCharacter(String value){ 
    this.mCharacter = value; 
} 

public void setMAlive(boolean alive){ 
    this.mAlive = alive; 
} 

public String getMCharacter(){ 
    return mCharacter; 
} 

public boolean getMAlive(){ 
    return mAlive; 
} 

} 

这是Villagerextends Card

public class Villager extends Card { 

public Villager(){ 
    mCharacter = "Villager"; 
} 


} 
+1

访问等活动变量直接是不好的做法,也使整个生命周期变得复杂。所以尝试通过'mAlive'布尔通过意图。 –

+0

如果您打算将一个“Villager”对象从一个Activity传递到另一个,则必须使用“Intent”,并且“Card”对象必须实现“Parcelable”接口。这是一个很好的例子:https://stackoverflow.com/questions/7181526/how-can-i-make-my-custom-objects-be-parcelable – victorantunes

+0

谢谢,我会更新我的代码,当我完成与应用程序,谢谢你的提示! – FET

回答

0

既然你宣布你的村民在活动一个,你应该能够从任何地方访问它静态

one.villagerOne.getMAlive() 

(这里我假设活动类别的名称是之一)

由于该解决方案似乎是有争议的,我会告诉你为什么我认为这是一个很好的一个:

如果通过意图通过村民的副本,你的村民被“封杀”,原来的村民会被销毁,为什么复制品仍然活着。这意味着你必须与每个活动联系一份副本,并告诉他们解散他们的村民的副本。听众和所有人。

如果使用参考静态成员,我建议,所有你需要做的就是测试null引用调用任何方法之前:

if(one.villagerOne != null) alive = one.villageOne.getMAlive(); 
+2

虽然它会以可怕的风格工作,并且会导致问题,如果活动重新与旧数据重新启动。如果你需要这样做,你的架构就会关闭。 –

+0

@GabeSechan Android源代码困扰着对静态类成员的访问。你应该看看它。如果它对于android编码者来说足够好,那么它对每个人来说都是足够好的 – ilomambo

+0

它不是一定是邪恶的静态成员。但活动的静态成员绝对是。我读过很多android源代码,除了静态常量外,其实并没有太多。这是一个糟糕的主意,它会被任何有能力的代码评论者自动拒绝。 –

0

如果你需要一个变量的副本,你应该通过额外的传递。如果您需要访问该实际变量,那么您可能应该重新构建。多个活动所需的数据不应该被任何活动所有,它应该被另一个活动可以到达的数据结构所拥有。例如可以查询其卡片列表的单件玩家对象。

0

我想,如果你让村民类实现Serializable接口,你可以使用像一个意图发送:

Intent i = new Intent(FirstActivity.this, SecondActivity.class); 
Villager villagerOne; 
villagerOne = new Villager(); 
i.putExtra("Villager", strName); 
startActivity(i); 

而在第二活动所得到的结果:

Villager villager = (Villager) getIntent.getSerializableExtra("Villager"); 
+1

尽管这里没有太大的区别,但实现'Parcelable'通常比Android更好。 – DeeV

+0

你说得对,但是我比使用Parcelable有更多使用Serializable的经验,所以这就是为什么我使用Serializable –