为什么可以';我是否使用字符串ID android.R.string.share?

为什么可以';我是否使用字符串ID android.R.string.share?,android,android-resources,Android,Android Resources,它就在Android源代码的values/strings.xml中,为什么不在Android.R中呢 编辑:我指的是Android的内置字符串资源(Android.R.string…),而不是我自己项目的资源-例如,虽然我可以使用Android.R.string.cancel,但,我不能使用android.R.string.share,尽管它们在android的源代码中声明在同一个文件中android.R是系统的R 您的R只是您自己的包名称中的R。因此,在引用它时,只需将其称为R.string.

它就在Android源代码的values/strings.xml中,为什么不在Android.R中呢


编辑:我指的是Android的内置字符串资源(
Android.R.string…
),而不是我自己项目的资源-例如,虽然我可以使用
Android.R.string.cancel
,但,我不能使用
android.R.string.share
,尽管它们在android的源代码中声明在同一个文件中

android.R是系统的R


您的R只是您自己的包名称中的R。因此,在引用它时,只需将其称为
R.string.share
,而不是
android.R.string.share

它们只是资源文件夹下的资源

<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="share">hello</string>
</resources>
您可以将Strings.xml中的字符串称为

  R.String.share
R.strin.share是一个int

您还可以按以下方式获取字符串:

   String s= getResources().getString(R.string.share);
编辑:

检查上述链接标题下的主题访问平台资源

Android包含许多标准资源,例如样式、主题和布局。要访问这些资源,请使用android软件包名称限定您的资源引用

有关所有资源的列表,请检查链接

来自


您正在编译哪个SDK版本?? 请检查同一SDK版本的strings.xml。我认为目标SDK版本和strings.xml不匹配(您指的是,其中存在“share”)


但是,我建议在application strings.xml中添加您自己的“share”字符串,以避免由于Android的碎片化特性而产生不必要的问题。

这是因为它不是在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();

public static int getrefactfield(String className,String fieldName){
int结果=0;
试一试{
Class clz=Class.forName(className);
Field=clz.getField(fieldName);
字段。setAccessible(true);
结果=field.getInt(null);
}捕获(例外e){
e、 printStackTrace();
}
返回结果;
}
...
int share_id=getrefactfield(“com.android.internal.R$string”,“share”);
如果(共享id!=0)
Toast.makeText(getContext(),“”+getResources().getString(share_id),0.show();
这在我的android 4.4和8.0设备上都有效

或者干脆用
getResources().getString(Resources.getSystem().getIdentifier(“共享”、“字符串”、“android”))

您应该在项目包名称下使用R。为什么要引用系统下的资源?因为一些字符串非常常见-例如“Cancel”-它已经在Android中被翻译成数百种语言,为什么我要在我可以基于他们的工作的基础上重新创建它?和图标一样,我使用的是android.R.drawable.ic_menu_share,这样我的应用程序总是使用当前平台的共享图标:)这就是我一直试图做的-但是android.R.string.share不存在(尽管在android源代码中strings.xml中定义了“share”字符串元素),它就在“cancel”旁边(我可以使用)-(这是ICS的分支,我的最低API版本-它也存在于所有高于该版本的API版本和主分支中)我知道strings.xml中有一个有限的列表,我可以使用-我最初的问题是为什么我不能使用其他strings系统的R将根据您使用的api级别而有所不同。这就是为什么不建议使用系统的R来处理这类事情。使用您自己的R处理字符串。这样您的应用程序将更便于移植。幸运的是,当API版本崩溃时,LINT会提醒我们——就我而言,R和任何其他API一样,我认为它不会停止工作(它可能会被标记为已弃用,但这是不同的)是的,它的工作原理与其他内部代码api一样。如果您在源代码中发现了一个api,但该api没有公开文档。您可以假设,谷歌或众多OEM中的任何一家将来可能会更改此内部api,因为该api也可能不会在兼容性测试套件中进行文档记录(原始设备制造商必须遵守)。这就是未记录的API。经验法则是不要使用它们。没有人向你保证它们会继续工作。事实上,谷歌只是不断地对开发者说尝试使用它们是错误的。他想访问系统字符串资源。我不认为sdk版本有任何问题。我也在谈论系统字符串资源,因为每个SDK版本都有自己的资源集,所以我怀疑daniel是否看到其他SDK版本strings.xml(不同于app target SDK)。从ics的这个链接。共享确实存在于android api 16中,因为我有android api 16,我交叉检查了相同的。你检查丹尼尔在我回答下面的评论。他说链接中提到的所有版本不是所有资源都是公共的,这就是为什么你不能访问共享。
   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();