Android getter setter返回null数据?

时间:2013-01-21 12:57:53

标签: 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 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

任何帮助。

5 个答案:

答案 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并在另一个中使用的要求,则有很多方法。

  1. 当您进入启动画面时,您可以直接获取活动中的字符串。
  2. 在启动画面中,将appDetails对象设为公共静态,以便您可以访问其他活动
  3. 在ApplicationDetails上实现序列化并将此对象放在putExtra中,因为我们将string,int等值用于在activity之间传递数据并使用bundle in started activity获取此数据
  4. <强>被修改

    对于使用单个对象,您需要在闪屏中将该对象声明为公共静态

    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());
        }
    
    }