想实现在Android这边写了UI,是继承Dialog的窗口,想通过Unity调用jar弹出该Dialog窗口,进行一些操作,发现弹出时会报错:Failed resolution of: Lcom/xxx/R$layout。
根据logcat的报错提示,找到发现是访问R.layout和R.id报了错。Android代码如下:
setContentView(R.layout.devices_dialog);
findViewById(R.id.lvBluetoothDevices);
这错误关键字太难找了,不知道怎么解决,谷歌了好多关键字,终于找到相关的解决方式。
https://qiita.com/RyotaMurohoshi/items/3b95daeb8eaa6b487a20
大概问题是,Unity似乎会自己生成R.java,所以覆盖了,导致访问的时候报错提示找不到id。
改成如下访问方式即可。
int layoutId = getResources().getIdentifier("xxx_ad_activity", "layout", getPackageName());
setContentView(layoutId);
用法举例:
例1:
setContentView(R.layout.devices_dialog);
改为:
int layoutId = getResources().getIdentifier("devices_dialog", "layout", getPackageName());
setContentView(layoutId);
例2:
findViewById(R.id.lvBluetoothDevices);
改为:
int layoutId = getResources().getIdentifier("lvBluetoothDevices", "id", getPackageName());
findViewById(layoutId);
注意:只有Activity类才有这个getResources方法。所以这是针对于代码写在Activity里的。
对于非Activity类,可以使用下列方式,获取主Activity调用里面的方法。亲测有效。下面提供了个工具类。
此工具类对Unity应用有效。
package com.egogame;
import android.app.Activity;
import android.util.Log;
public class EAndroidUtil {
static Activity unityActivity;
public static int GetRId(String activityName){
return GetRValue(activityName,"id");
}
public static int GetRLayoutId(String activityName){
return GetRValue(activityName,"layout");
}
public static int GetRValue(String activityName, String defType){
int layoutId = getActivity().getResources().getIdentifier(activityName,
defType, getActivity().getPackageName());
//android.util.Log.d("EgoGameLog", activityName+"==="+getActivity().toString()+"==="+layoutId);
return layoutId;
}
/**
* 利用反射机制获取unity项目的上下文
* @return
*/
public static Activity getActivity(){
if(null == unityActivity) {
try {
Class<?> classtype = Class.forName("com.unity3d.player.UnityPlayer");
Activity activity = (Activity) classtype.getDeclaredField("currentActivity").get(classtype);
unityActivity = activity;
} catch (ClassNotFoundException e) {
System.out.println(e.getMessage());
} catch (IllegalAccessException e) {
System.out.println(e.getMessage());
} catch (NoSuchFieldException e) {
System.out.println(e.getMessage());
}
}
return unityActivity;
}
}