2017-10-15 65 views
0

我想用strings.xml中的数组声明一个静态字符串数组。有没有办法从strings.xml中定义一个静态字符串数组

private static final String[] tip_types = getResources().getStringArray(R.array.tip_types_array); 

,但你不能“在静态情况下”使用getResources()。有没有办法做到这一点,或者我不能使用静态变量?

显然

private final String[] tip_types = getResources().getStringArray(R.array.tip_types_array); 

作品,但随后的声明数组也不是一成不变的。

+0

为什么你真的需要一个静态字符串[]更好地创造一个静态方法返回斯汀[],并通过上下文或资源对象挑选所需的阵列 – Killer

+0

你可以拥有它是'static',但它不能'final',并且当你有一个'Context'时,你需要能够在某个时候初始化它。 – CommonsWare

+0

我当时是个白痴!我试图从我的代码开始时将一个强烈的封闭声明移动到strings.xml中。 '='后面的所有内容都是显式声明,所以我只是试图用代码替换它。那是错误的做法。我现在已将'getResources ...'移到实际使用数组的代码中。 –

回答

0

要获取资源(包括字符串),您总是需要一个上下文。当您创建一个静态字段时,即使在一个活动中,也不能访问实例字段,因此没有可用的上下文。

有两个选项来解决这个问题:

方法1
您可以创建在创建存储应用程序上下文静态字段的应用类别及使用应用程序上下文得到您的字符串数组。

private final static String[] tip_types = YourApplicationClass.getAppContext().getResources().getStringArray(R.array.tip_types_array); 

方法2
您可以为静态变量创建一个getter,你传递的上下文。像单身人士一样,您检查数组是否已经解决,并立即返回或者使用提供的上下文进行抓取。这具有惰性初始化的优点,数组仅在实际需要时才创建。

private static String[] tip_types; 

private static String[] getTipTypes(Context context) { 
    if(tip_types == null) { 
     tip_types = context.getResources().getStringArray(R.array.tip_types_array); 
    } 
    return tip_types; 
} 
+0

我已经接受了这个答案,因为它很好地解释了为什么我正在尝试没有奏效 - 即使我的问题是我首先尝试做错了事情! (请参阅我对原始问题的评论) –

相关问题