Java Android 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

我有一个类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);
对于示例,我只是从字符串文件设置数据,但在应用程序中它来自不同的源

但当我试图访问不同活动中的数据时,它返回空值。 e、 g

输出

I/System.out(2242):  app support url null

任何帮助

更新

当你们在启动屏幕中设置值时,内存中的对象是不同的,而在另一个活动中,你们创建了另一个内存中也不同的对象,这就是为什么你们得到空值

如果这是您在启动屏幕中初始化url的要求,并在另一个屏幕中使用,那么有很多方法

  • 当您进入启动屏幕时,可以直接在活动中获取字符串
  • 在启动屏幕中,使appDetails对象成为公共静态对象,以便您也可以在其他活动中访问
  • 在ApplicationDetails上实现序列化,并将此对象放入putExtra中,因为我们在活动之间传递数据时放入string、int等值,并在启动的活动中使用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());
        }
    
    }
    

    作为快速解决方案,您可以使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,并且必须再次设置字符串。