Java Android getter setter返回空数据?
我有一个类ApplicationDetails,带有getter和setter方法Java Android getter setter返回空数据?,java,android,setter,getter,getter-setter,Java,Android,Setter,Getter,Getter Setter,我有一个类ApplicationDetails,带有getter和setter方法 public class ApplicationDetails { String supportURL; String companyURL; String copyRightText; // with getter and setter methods } 我正在设置启动屏幕活动中的所有数据 ApplicationDetails appDetails = new Appl
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);
对于示例,我只是从字符串文件设置数据,但在应用程序中它来自不同的源
但当我试图访问不同活动中的数据时,它返回空值。
e、 g
输出
I/System.out(2242): app support url 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());
}
}
作为快速解决方案,您可以使supportURL对象保持静态,但这不是一个好的解决方案
public class ApplicationDetails {
static String supportURL;
static String companyURL;
static String copyRightText;
// with getter and setter methods
}
更好的解决方案是在启动AboutViewController活动时,将字符串从一个活动传递到另一个活动。您可以使用共享首选项存储要通过应用程序使用的数据。
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 {
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);
}
}
您会得到null,因为您创建了一个新对象,并且所有字段都初始化为零
在您的例子中,我看到这些字段在整个应用程序中都是相同的,所以您可以使用一个模式,只为应用程序实例化一个对象,并在以后引用它。无需每次引用新对象时都创建它。这对这个类来说是可以的,你也可以让它们成为常量。(我想这些变量不会因为执行而改变)谢谢大家的建议。现在我只使用一个类的实例
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();
很好。创建一个新的
ApplicationDetails
对象并从中读取。当然,它会有默认值,而不是您之前在一个完全不同的对象上设置的值。在尝试类似的事情之前,您需要了解一些java、oop和编程的一般知识。您可以通过Singleton类实现您的目标“仅通过类对象获取值”意味着什么?那么,将值初始化为(同样无用的)空字符串在这里有什么帮助呢?好的,谢谢,我弄错了,如何只使用一个对象来设置数据并在不同的活动中获取数据?这永远不是一个好的解决方案。因为android框架的设计方式是,当内存不足时,它会杀死你的应用程序。在这种情况下,您将获得所有字段的null,并且必须再次设置字符串。