sickworm / AndroidXMLToJava

AX2J - A tool that transfers Android XML to Java code(XML block or whole project)
http://ax2j.sickworm.com
MIT License
29 stars 3 forks source link

selectorTranslate.translate() 返回值为字符串,怎么执行? #1

Closed wenlongwangl closed 6 years ago

wenlongwangl commented 8 years ago

该方法返回值为字符串,怎么执行该代码并将其添加到指定控件上? StateListDrawable addState()。

sickworm commented 8 years ago

hello,很高兴你关注到我这个太监了的side project。。 这个软件最终形态是一个带界面的小工具,你导入一个Android工程,他会把里面的xml全部转换成java代码,并打包成jar包给你使用。但目前的话你只能手动把工程导进去,(暂不支持部分xml转换)。做法:

1.把你的整个eclipse Android工程放到该工程的根目录下,并把项目文件夹命名为project。 2.导入这个工程到eclipse,运行ProjectConverter.java的main函数 3.结果会输出到该工程的project_out目录中

StateListDrawable这个转换是调试过,可以用的。不过我不确定我描述的步骤是否可以执行成功。。 我决定重新开始,继续把它写完。。谢谢你的关注

wenlongwangl commented 8 years ago

你好,太客气了,还要多感谢能开源出来自己的研究。

我现在的需求是这样的: 动态解析外部(从服务器下载)的selector文件,并应用到控件(例如button)上。 当前调用SelectorTranslator.translate()就已经完成了动态解析并且返回了java代码,可我要怎么来执行这段代码并且应用到控件上呢?

+Q:576163117.

sickworm commented 8 years ago

大概了解了,我想到两个方法:

如果你需要执行一段java代码,需要将java代码编译

参考一下这个: http://zhidao.baidu.com/link?url=rDUy0Z26iN3KPNHyjQQBHXgeR6ZgUS0DKjaFGw_7H6twHd2iebU6pbnNrKqHUyJM_iFHLLqpOXGYyDcTZWpUxq 可能需要做成jar包,再用classloader载入。但编译这个前提还是要的。因为我这个做的是一个pc工具,所以不具备动态加载的功能。(感觉以后可以做)

你已经有一段StateListDrawable的控件代码了,你可以用 正则 把方法和参数分离出来。然后套用进你的模板。

举个例子: 你翻译出这段代码:

StateListDrawable stalistDrawable = new StateListDrawable();  

stalistDrawable.addState(new int []{android.R.attr.state_selected, android.R.attr.state_focused},getResources().getDrawable(R.drawable.pic1));
stalistDrawable.addState(new int []{android.R.attr.state_selected, - android.R.attr.state_focused}, getResources().getDrawable(R.drawable.pic2, getResources().getDrawable(R.drawable.pic1));  

你使用正则把addState里面的参数提取出来:

new int []{android.R.attr.state_selected, android.R.attr.state_focused}
// 即android.R.attr包中的state_selected, state_focused
getResources().getDrawable(R.drawable.pic1)
// 即R.drawable包中的pic1

然后通过反射把参数的值取出来,如{android.R.attr.state_selected = 100, android.R.attr.state_focused = 200, R.drawable.pic1 = 0x80000012,再把他: addState(int [] {100, 200}, getResources().getDrawable(0x80000012));

也就是说,你用这个项目生成的String只是相当于一个配置文件,你在代码中好解析逻辑,再用自己的代码执行这些参数

个人推荐第2个,因为第一个不确定能不能用。

如果可以,我觉得更好的方法是:先在服务器把XML代码翻译成自定义格式的配置文件;或先转换成Java代码并打包成jar包,然后apk用classloader读取,这样实现会方便一些。(含有classloader读取代码的应用不可以上Google Play)

wenlongwangl commented 8 years ago

再次感谢,提供这么多自己的意见。 现在还没有很系统的逻辑和想法,再捋捋,有了进展再来请教啊,多谢。

sickworm commented 8 years ago

好的,有空多聊聊