我有一个类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值。 e.g。
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
任何帮助。
答案 0 :(得分:5)
您得到null,因为您创建了一个新对象,并且所有字段都初始化为零。
在您的情况下,我看到这些字段在应用程序中将是相同的,因此您可以使用Singleton模式并仅为您的应用程序实例化一个对象并在以后引用它。每次引用它时都不需要创建新对象。这个类没关系,你也可以使它们成为常量。 (我猜这些变量不会因执行而改变)
答案 1 :(得分:0)
作为快速解决方案,您可以使您的supportURL对象保持静态,但这不是一个好的解决方案。
public class ApplicationDetails {
static String supportURL;
static String companyURL;
static String copyRightText;
// with getter and setter methods
}
更好的解决方案是在启动AboutViewController Activity时将字符串从一个活动传递到另一个活动。
答案 2 :(得分:0)
您可以使用共享首选项来存储要通过应用程序使用的数据。 这里构造函数中的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);
}
}
答案 3 :(得分:0)
感谢大家的所有建议。现在我只使用一个类的一个实例。
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很好。
答案 4 :(得分:-2)
<强>更新强>
当您在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());
}
}