1

我有一类 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);

对于示例,我只是从字符串文件中设置数据,但在应用程序中它来自不同的来源。

但是当我尝试访问不同活动中的数据时,它返回空值。例如

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

任何帮助。

4

5 回答 5

5

您得到 null,因为您创建了一个新对象并且所有字段都初始化为零。

在您的情况下,我看到这些字段在应用程序中将是相同的,因此您可以使用单例模式并为您的应用程序仅实例化一个对象并稍后引用它。您不需要在每次引用它时都创建一个新对象。这个类没问题,你也可以让它们成为常量。(我猜这些变量不会通过执行而改变)

于 2013-01-21T13:15:09.200 回答
0

作为快速解决方案,您可以将 supportURL 对象设为静态,但这不是好的解决方案。

public class ApplicationDetails {
static String supportURL;
static String companyURL;
static String copyRightText;

// with getter and setter methods 

}

更好的解决方案是在启动 AboutViewController 活动时将字符串从一个活动传递到另一个活动。

于 2013-01-21T13:11:46.890 回答
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);
        }
    }
于 2013-01-21T13:14:44.810 回答
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();

它工作得很好。

于 2013-01-21T13:22:22.300 回答
-2

更新

当您在启动画面中设置值时,内存中的对象是不同的,而在另一个活动中,您创建的另一个对象在内存中也不同,这就是您获得 null 的原因。

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

  1. 当您进入初始屏幕时,您可以直接在活动中获取字符串。
  2. 在启动画面中,将 appDetails 对象设为公共静态对象,以便您也可以在其他活动中访问
  3. 在 ApplicationDetails 上实现序列化并将此对象放入 putExtra 中,因为我们将字符串、int 等值用于在活动之间传递数据并在启动的活动中使用捆绑包获取此数据

已编辑

要使用单个对象,您需要将该对象声明为初始屏幕中的公共静态

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

}
于 2013-01-21T13:04:32.153 回答