最近三年一直在做游戏SDK开发,当然也会开发自己的SDK,很多人遇到了把资源逻辑写在SDK里面然后封装成jar包,给别人用的时候,别人应用jar包,引入你写的相关的API,却提示找不到R文件。
那是因为你在SDK布局还有引用R的时候都是R.id.xx或者R.layout.xx。在APP里面写没所谓,我以前也是做APP的,也不用动态引用资源ID什么的。但是当你写SDK,用到了资源ID一定要动态引用。因为这个资源ID是在你目前工程环境下,你打出jar包给别人引用就算资源一个不落的拷贝过去,但是资源引用的环境变了。
下面动态查找资源layout id示例代码:
int id = context.getResources().getIdentifier("yingsdk_game_login_fixpwd_phone_dialog", "layout", context.getPackageName());
if (id == 0) {
return;
}
final View view = View.inflate(context, id, null);
setContentView(view);
动态查找资源控件 id示例代码:
button_close = (Button) findViewById("yingsdk_dialog_btn_close");
public View findViewById(String resName) {
return super.findViewById(getContext().getResources().getIdentifier(resName, "id", getContext().getPackageName()));
}
注意findViewById(String resName)是封装的一个方法,而不是直接调用的系统的
这样就完全可以避免R文件找不到的问题了,市面上的一些游戏SDK,以及第三方SDK用的不出问题,那完全是别人都是用这种方式处理好了的(我说的不是在AS以build gradle形式)而是以libs和res资源文件依赖的方式,例如facebook和谷歌你直接用AS build引用没问题,如果你业务需求需要用eclipse接呢?或者是以jar还有资源文件接呢?如果不用脚本做处理,直接引用那就会报错的。当然如果有更好的方法,也可以探讨哇。
网友评论