[英]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並在另一個中使用的要求,那么有很多方法。
編輯
對於使用單個對象,您需要在閃屏中將該對象聲明為公共靜態
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.