2017-05-05 45 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> 

希望這將有助於〜

相關問題