繁体   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