我正在Android Studio中设计游戏。我有一个包含多个片段的活动。我还有一个Player对象,我想创建一个。的实例。
Player player1 = new Player();
我的活动中的所有这些碎片网都将对player1.
进行更改
而不是将此对象传递给每个Fragment和连续的活动:
intent.putExtra("Player",player1);
有没有办法从其他片段和活动中访问player1而不用通过putExtra()
方法传递它的麻烦?
我尝试将player1设为静态:
static Player player1 = new Player();
但是,我无法从其他player1
个活动文件中访问.java
。
所以,基本上,我想要一个策略来使player1
成为一个GLOBAL对象,我可以随时随地引用它。我不想让Player类中的所有方法都是静态的,因为我希望能够在我的游戏中拥有player1
,player2
和player3
个文件,所以我需要能够创建一个Player
的实例,如果每个方法都是静态的,我不认为可以做到(对吗?)
我刚刚开始OOP,所以我确信我会忽略一些简单的东西,或者也许不是搞乱修饰符,有更好的方法来实现我想要的东西。也许通过使用界面?界面如何工作?
如何通过创建extends Application
的类来在应用程序对象中存储信息?
答案 0 :(得分:2)
如果您想在任何地方访问它,并且不关心隐私,则需要进行public
public static Player player1 = new Player();
默认值仅为包级别访问。
您可以在其他类中使用此语法来访问它:
Activity1.player1; // do something...
注意:可能有更好的设计选择,只需创建一个字段public
,这样您就可以在任何地方访问它,但这只是最低限度的需要。不建议以这种方式进行,并且由于您正在学习,您可能想要阅读其中一些设计概念。
例如,公共getter / setter的使用通常是访问类/实例字段的常用方法之一。
private static Player player1 = new Player();
public static Player getPlayer1() { return player1; }
public static void setPlayer1(Player p) { player1 = p; }
// ...
所以,基本上,我想要一个策略让player1成为一个GLOBAL对象,我可以随时随地引用它。我不想让Player类中的所有方法都是静态的,因为我希望能够在我的游戏中拥有player1,player2和player3文件,所以我需要能够创建一个Player的实例,如果每种方法都是静态的,我不认为可以做到(对吗?)
不,那不是真的。只要存在公共构造函数和/或它不是抽象的,就可以实例化具有static
方法的类。 static
只是意味着它在类级别访问,并且不需要实例,但您仍然可以从对象引用访问static
方法。 static
但也意味着所有实例共享相同的字段,因此在所有类的实例中只有一个字段,方法等。
您可能考虑使用的一种设计模式是Singleton模式,它允许您在需要时获取类的单个实例,因此您不需要弄乱静态属性和方法(如果你不需要使用它们可能有缺点)。
如何通过创建
extends Application
的类来在应用程序对象中存储信息?
根据documentation,这是一种可以接受的方式,尽管你可能仍然想要考虑一些整体设计选择,并确定这是否真的是你想要采取的路线。
需要维护全局应用程序状态的基类。您可以通过在AndroidManifest.xml标记中指定其名称来提供自己的实现,这将导致在创建应用程序/包的过程时为您实例化该类。
答案 1 :(得分:0)
如果其他人想知道,另一个解决方案是让你的班级(MyClass.java
)添加extends Application
,然后转到你的Android清单并添加android:name
参考:
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="companyname.projectname.MyClass">
<activity
android:name=".MyActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
然后当您需要访问对象时:
Player player = (Player)getApplication();
这将保留应用程序整个生命周期的对象实例。它工作,但我喜欢上面解释的静态方法。此外,我不确定这是否是一种理想的方法......