在Android Studio App

时间:2015-06-25 16:06:58

标签: java android-studio

我正在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类中的所有方法都是静态的,因为我希望能够在我的游戏中拥有player1player2player3个文件,所以我需要能够创建一个Player的实例,如果每个方法都是静态的,我不认为可以做到(对吗?)

我刚刚开始OOP,所以我确信我会忽略一些简单的东西,或者也许不是搞乱修饰符,有更好的方法来实现我想要的东西。也许通过使用界面?界面如何工作?

如何通过创建extends Application的类来在应用程序对象中存储信息?

2 个答案:

答案 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();

这将保留应用程序整个生命周期的对象实例。它工作,但我喜欢上面解释的静态方法。此外,我不确定这是否是一种理想的方法......