它位于Android源代码中的values / strings.xml中 - 为什么它不在android.R中?
编辑:我指的是Android的内置字符串资源(android.R.string.…
),而不是我自己项目的资源 - 例如,我可以使用android.R.string.cancel
,我不能使用android.R.string.share
,尽管它们中的两个在Android的源代码中被声明在同一个文件中
答案 0 :(得分:1)
它们只是资源文件夹下的资源。
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="share">hello</string>
</resources>
上面的资源在R.java文件中有一个条目,在你的包名下。你可以打开R.java并查看它。
public static final int share=0x7f040000;
您可以将Strings.xml中的字符串称为
R.String.share
R.strin.share是一个int。
你也可以把字符串作为
String s= getResources().getString(R.string.share);
编辑:
http://developer.android.com/guide/topics/resources/accessing-resources.html#PlatformResources
查看上面链接标题访问平台资源
下的主题Android包含许多标准资源,例如样式,主题和布局。要访问这些资源,请使用android软件包名称限定资源引用。
有关所有资源的列表,请查看链接
http://developer.android.com/reference/android/R.html
http://developer.android.com/reference/android/R.string.html
中的列表
答案 1 :(得分:1)
您正在编译哪个SDK版本? 请检查相同SDK版本的strings.xml。我认为目标SDK版本和strings.xml中存在一些不匹配(您指的是“共享”存在的位置)
但是我会建议在应用程序strings.xml中添加您自己的“share”字符串,以避免因Android碎片性质而导致不必要的问题。
答案 2 :(得分:0)
android.R是系统的R
您的R只是您自己的包名称中的R.因此,在引用它时,只需将其称为R.string.share
而不是android.R.string.share
。
答案 3 :(得分:0)
这是因为它不是在android.R.string中定义的,而是在com.android.internal.R $ string中定义的。没有一些“黑客”就无法访问它。
public static int getReflactField(String className,String fieldName){
int result = 0;
try {
Class<?> clz = Class.forName(className);
Field field = clz.getField(fieldName);
field.setAccessible(true);
result = field.getInt(null);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
...
int share_id=getReflactField("com.android.internal.R$string", "share");
if(share_id!=0)
Toast.makeText(getContext(), ""+getResources().getString(share_id),0).show();
这在我的android 4.4和8.0设备上都有效
或者简单地使用
getResources().getString(Resources.getSystem().getIdentifier("share","string", "android"))