Android项目中如何在用已持有的其他应用(B)的context获取到B的R文件中的所有的id值

seaful2015 2017-10-16 04:36:28

如图,其实就是想获取另一个应用的res-value中strings.xml文件中所有的key值 也就是开发过程中所有的R.string.xxx中的xxx
这样的话,在自动化测试过程中,就可以测试多国语言而不用修改用例了

这种方式已用过,目的其实就想把strings.xml这个文件解析出来提供给测试妹子,省的再去找开发人员要
...全文
397 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
seaful2015 2018-03-28
  • 打赏
  • 举报
回复
引用 5 楼 chenshi011 的回复:
[quote=引用 4 楼 shunnian2015 的回复:] [quote=引用 3 楼 chenshi011 的回复:] 楼上所说的: 1.getResources().getIdentifier(com.xxx:string/xxx,null,null)获取到ResId; 2.然后getResources().getString(resid) 不用拿app_name的
其实就是想拿 这里面的所有xxx(R.string.xxx) 比如刚刚使用的是app_name 我想拿到"app_name" 真实场景:app随便一个界面(假设已经适配多国语言) 看到一个 帮助/help按钮,于是想知道它在中英文res/values 下的name是什么 是R.strings.help 还是R.string.helps 还是R.strings.xxx 只要最后一个点后面的部分[/quote] 你要的这个那可以通过反射获取啊,java有个好处是都可以反射拿到。 我刚反射写了一下,不知道你是不是要这个:
List<String> getPackageResource(String pkg, String Identifier) {
        List<String> result = null;
        try {
            Class<?> c = Class.forName(pkg + ".R");
            result = new ArrayList<String>();
            Class<?>[] classes = c.getDeclaredClasses();
            for (Class<?> subClass : classes) {
                if (subClass.getSimpleName().equals(Identifier)) {
                    Field[] fields = subClass.getDeclaredFields();
                    for (Field field : fields) {
                        result.add(field.getName());
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return result;
    }
pkg传package,Identifier你要string就传string好了。其实你可以看R.java文件就知道怎么反射了。[/quote] 谢谢!可以获取了!学到了,R文件的反射方式
seaful2015 2017-10-23
  • 打赏
  • 举报
回复
引用 3 楼 chenshi011 的回复:
楼上所说的: 1.getResources().getIdentifier(com.xxx:string/xxx,null,null)获取到ResId; 2.然后getResources().getString(resid) 不用拿app_name的
其实就是想拿 这里面的所有xxx(R.string.xxx) 比如刚刚使用的是app_name 我想拿到"app_name" 真实场景:app随便一个界面(假设已经适配多国语言) 看到一个 帮助/help按钮,于是想知道它在中英文res/values 下的name是什么 是R.strings.help 还是R.string.helps 还是R.strings.xxx 只要最后一个点后面的部分
文明游戏 2017-10-23
  • 打赏
  • 举报
回复
引用 4 楼 shunnian2015 的回复:
[quote=引用 3 楼 chenshi011 的回复:] 楼上所说的: 1.getResources().getIdentifier(com.xxx:string/xxx,null,null)获取到ResId; 2.然后getResources().getString(resid) 不用拿app_name的
其实就是想拿 这里面的所有xxx(R.string.xxx) 比如刚刚使用的是app_name 我想拿到"app_name" 真实场景:app随便一个界面(假设已经适配多国语言) 看到一个 帮助/help按钮,于是想知道它在中英文res/values 下的name是什么 是R.strings.help 还是R.string.helps 还是R.strings.xxx 只要最后一个点后面的部分[/quote] 你要的这个那可以通过反射获取啊,java有个好处是都可以反射拿到。 我刚反射写了一下,不知道你是不是要这个:
List<String> getPackageResource(String pkg, String Identifier) {
        List<String> result = null;
        try {
            Class<?> c = Class.forName(pkg + ".R");
            result = new ArrayList<String>();
            Class<?>[] classes = c.getDeclaredClasses();
            for (Class<?> subClass : classes) {
                if (subClass.getSimpleName().equals(Identifier)) {
                    Field[] fields = subClass.getDeclaredFields();
                    for (Field field : fields) {
                        result.add(field.getName());
                    }
                }
            }
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        return result;
    }
pkg传package,Identifier你要string就传string好了。其实你可以看R.java文件就知道怎么反射了。
文明游戏 2017-10-20
  • 打赏
  • 举报
回复
楼上所说的: 1.getResources().getIdentifier(com.xxx:string/xxx,null,null)获取到ResId; 2.然后getResources().getString(resid) 不用拿app_name的
seaful2015 2017-10-19
  • 打赏
  • 举报
回复
想取到的是另一个app的strings.xml中所有的resourceEntryName,所以想用R.string.xxx(也就是int值)作为参数是行不通的,因为R文件都不是一个 现在至多是可以在手机界面上看到R.string.xxx对应显示的值,要通过这个值查询这个strings.xml查出来它的key。绕么,哈哈 反正我是还没搞出来
jklwan 2017-10-18
  • 打赏
  • 举报
回复
看你代码,resourceName不就是key值吗 例如:getResources().getIdentifier("app_name", "string", getPackageName())获取的是id,等于R.string.app_name;getResources().getResourceEntryName(R.string.app_name)取到的就是app_name;

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧