簡體   English   中英

Android getter setter返回null數據?

[英]Android getter setter returns null data?

我有一個類ApplicationDetails,使用getter和setter方法。

public class ApplicationDetails {
    String supportURL;
    String companyURL;
    String copyRightText;

    // with getter and setter methods 

}

我在啟動畫面活動中設置所有數據。

ApplicationDetails appDetails = new ApplicationDetails();
String supportURL = getResources().getString(R.string.support_url);
appDetails.setSupportURL(supportURL);

對於示例我只是從字符串文件設置數據,但在應用程序中它來自不同的來源。

但是當我嘗試訪問不同活動中的數據時,它返回null值。 例如

public class AboutViewController extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        ApplicationDetails appDetails = new ApplicationDetails();
        System.out.println(" app support url " + appDetails.getSupportURL());
    }

}

產量

I/System.out(2242):  app support url null

任何幫助。

您將獲得null,因為您創建了一個新對象,並且所有字段都初始化為零。

在您的情況下,我看到這些字段將通過應用程序相同,因此您可以使用Singleton模式並僅為您的應用程序實例化一個對象,並在以后引用它。 每次引用它時都不需要創建新對象。 這個類沒關系,你也可以使它們成為常量。 (我猜這些變量不會因執行而改變)

作為快速解決方案,您可以使您的supportURL對象保持靜態,但這不是一個好的解決方案。

public class ApplicationDetails {
static String supportURL;
static String companyURL;
static String copyRightText;

// with getter and setter methods 

}

更好的解決方案是在啟動AboutViewController活動時將字符串從一個活動傳遞到另一個活動。

您可以使用共享首選項來存儲要通過應用程序使用的數據。 這里構造函數中的Context只是你的Activity。

public class ApplicationDetails {

        public static final String SUPPORT_URL = "support_url"; 
        public static final String COMPANY_URL = "company_url";
        public static final String COPYRIGHT_URL = "copyright_url";

        String supportURL;
        String companyURL;
        String copyRightText;
        private Context context;

        public ApplicationDetails(Context context) {
            super();
            this.context = context;
        }

        private String getPreference(String key)
        {
            return PreferenceManager.getDefaultSharedPreferences(context).getString(key, null);
        }

        private void setPreference(String key, String value)
        {
            PreferenceManager.getDefaultSharedPreferences(context).edit().putString(key, value).commit();
        }

        public String getSupportURL() {
            if(supportURL == null)
                supportURL = getPreference(SUPPORT_URL);
            return supportURL;
        }

        public void setSupportURL(String supportURL) {
            this.supportURL = supportURL;
            setPreference(SUPPORT_URL, supportURL);
        }

        public String getCompanyURL() {
            if(supportURL == null)
                supportURL = getPreference(COMPANY_URL);
            return companyURL;
        }

        public void setCompanyURL(String companyURL) {
            this.companyURL = companyURL;
            setPreference(COMPANY_URL, companyURL);
        }

        public String getCopyRightText() {
            if(copyRightText == null)
                copyRightText = getPreference(COPYRIGHT_URL);
            return copyRightText;
        }

        public void setCopyRightText(String copyRightText) {
            this.copyRightText = copyRightText;
            setPreference(COPYRIGHT_URL, copyRightText);
        }
    }

謝謝所有的建議。 現在我只使用一個類的一個實例。

public class ApplicationDetails {

private static ApplicationDetails instance = null;

String supportURL;
String companyURL;
String copyRightText;

// with getter and setter methods 

public static ApplicationDetails getInstance() {
 if (instance == null) {
    instance = new ApplicationDetails();
 }
   return instance;
 }

}

我正在設置並且變得像這樣

 ApplicationDetails appDetails = ApplicationDetails.getInstance();
 appDetails.setSupportURL(supportURL);

和活動

ApplicationDetails appDetails = ApplicationDetails.getInstance();
appDetails.getSupportURL();

它的wrk很好。

更新

當您在Splash屏幕中設置值時,內存中的對象不同,而在另一個活動中,您創建另一個內存也不同的對象,這就是為什么您獲得null。

如果這是您在啟動屏幕中初始化URL並在另一個中使用的要求,那么有很多方法。

  1. 您在啟動畫面中直接獲取活動中的字符串。
  2. 在啟動畫面中,將appDetails對象設為公共靜態,以便您也可以訪問其他活動
  3. 在ApplicationDetails上實現序列化並將此對象放在putExtra中,因為我們將string,int等值用於在activity之間傳遞數據並使用bundle在啟動的活動中獲取此數據

編輯

對於使用單個對象,您需要在閃屏中將該對象聲明為公共靜態

public static ApplicationDetails appDetails;

現在在啟動畫面oncreate()中分配值,並在另一個活動中使用,或者甚至是另一個類也使用這種方式

public class AboutViewController extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // direct use object by class name
        System.out.println(" app support url " + SplashScreen.appDetails.getSupportURL());
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM