2017-05-05 44 views
1

我正在学习MVC。我的项目有很多变数。所以我为他们创建了一个名为MainVariables的新类。尝试在空对象引用上调用虚拟方法 - 全局变量类

public class MainVariables { 

private String mPictureDirectory; 
private String mNameOfThePictureFile; 
private String mFullPathPicture; 
private double mLongitude; 
private double mLatitude; 
private String mAddress; 
private String mCity; 
private String mState; 
private String mCountry; 
private String mPostalCode; 
private String mKnownName; 
private String mDescription; 
private String mSolicitationType; 
... 
... 

其余由每个变量的自动getter和setter组成。

我在访问和转换整个应用程序中的这些变量时遇到问题。

我试图通过铸造在其他文件中的以下访问它:

private MainVariables mMainVariables; 

上面的代码引发错误Attempt to invoke virtual method on a null object reference

然后我试过如下:

private MainVariables mMainVariables = new MainVariables(); 

现在,这确实有效。只在它使用的文件中。例如,我在“SolicitationFragment”中设置变量,当我尝试在“PostFragment”上访问它时,我得到一个空的结果。因为我不得不在每个文件上初始化MainVariables。

我该如何解决这个问题,并能够在全球范围内访问我的变量?

+0

你可以有访问您的所有类mMainVariables的静态实例[。](https://android-app-promotion.com/) – BayK

回答

1

如果你不打算改变它们,使变量为静态或最终。这样,您就不必创建一个新的实例,并可以调用MainVariables.mPictureDirectory立即

public class MainVariables { 
    public static String mPictureDirectory; 
} 

另一种选择是一个单例模式,这种方式创建一个对象只有一个实例,仍然可以使用getter和setter

public class MainVariables { 
    private static MainVariables mInstance = null; 

    private String mString; 

    private MainVariables(){ 
     mString = "Hello"; 
    } 

    public static MainVariables getInstance(){ 
     if(mInstance == null) 
     { 
      synchronized (MainVariables.class) { 
      if (mInstance== null) { 
       mInstance= new MainVariables(); 
      }    
     } 
     return mInstance; 
    } 

    public String getString(){ 
     return this.mString; 
    } 

    public void setString(String value){ 
     mString = value; 
    } 
} 

在您的MainActivity你可以声明字段
MainVariables mainVariables = MainVariables.getInstance()
,并呼吁从根本随时随地
mainVariables.[METHOD]在MainActivity

+0

这就是事情尽管如此,我正在动态地改变它们......另外,我正在使用getter和setter,我对此感到更加舒服。 – Rosenberg

+1

看我的编辑,我觉得你想要一个单身人士 – Denny

+0

我在我的MainVariables中实现了getInstance()。我将如何去初始化它?我需要每个文件初始化一次,还是只在主要活动中执行? – Rosenberg

1

创建一个类扩展您的Application类并创建一个方法来获得的MainVariables实例:

AppController.java

public class AppController extends Application { 

    private MainVariables mMainVariables; 
    private static AppController mInstance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     mInstance = this; 
    } 

    public static synchronized AppController getInstance() { 
     return mInstance; 
    } 

    public MainVariables getMainVariables() { 

     if (mMainVariables == null) { 
      mMainVariables = new MainVariables(); 
     } 
     return mMainVariables; 
    } 
} 

MainVariables.java

public class MainVariables { 

    private String string; 

    public String getString(){ 
     return this.string; 
    } 

    public void setString(String string){ 
     this.string = string; 
    } 
} 

用途:

// SET VALUE 
AppController.getInstance().getMainVariables().setString("Hello Android"); 

// GET VALUE 
String str = AppController.getInstance().getMainVariables().getString(); 

仅供参考,您必须添加在你AndroidManifest.xml下档applicationAppController类。

<application 
    android:name=".AppController"> 

</application> 

希望这将有助于〜

相关问题