前言
在使用android studio 的過(guò)程中,我們做開發(fā)總是習(xí)慣的根據(jù)UI設(shè)計(jì)將尺寸值和字符串直接寫進(jìn).xml文件中,這樣做是非常不符合android開發(fā)規(guī)范的,不管leader跟你說(shuō)了幾次,“不要在layout中硬編碼”,但是大家總是這樣子做,因?yàn)槲覀冏龀绦蜷_發(fā)的就是懶啊,所以就有了這個(gè)插件的用武之地了,哈哈。
使用
1 .大家可以去我的github的網(wǎng)址:LayoutFormat_androidstudioplugin 下載AndroidPlugin_Layoutformat.jar,然后在adnroid studio 中,操作:
雙擊shift > 搜索Plugins (搜索 include no-project items要勾選))>點(diǎn)擊Plugins > install plugin form disk... >選擇下載的jar包 >重啟android studio >在 layout 中右鍵 refactor > LayoutFormat,ok啦
想要學(xué)習(xí)源碼的可以將整個(gè)倉(cāng)庫(kù)fork過(guò)去。
2 .大家可以在 Plugins 下 選擇 Browse repositories...,然后搜索 LayoutFormat 即可,過(guò)幾天應(yīng)該就通過(guò)審核,就會(huì)在intellj plugin 倉(cāng)庫(kù)中搜到了。
展示
1 . 批量去格式化layout.xml

2 .修改某一個(gè)layout.xml

使用中可能會(huì)遇到的問(wèn)題
在導(dǎo)入插件時(shí),windows下可能會(huì)出現(xiàn)插件加載失敗的情況。會(huì)報(bào)下面的錯(cuò)誤:
cannot create class "com.shang.layoutformat.LayoutFormat" [Plugin: com.shang.android.layoutformat]
com.intellij.diagnostic.PluginException: cannot create class "com.shang.layoutformat.LayoutFormat" [Plugin: com.shang.android.layoutformat]
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.convertStub(ActionManagerImpl.java:177)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.convert(ActionManagerImpl.java:515)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.getActionImpl(ActionManagerImpl.java:495)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.getAction(ActionManagerImpl.java:488)
at com.intellij.openapi.actionSystem.DefaultActionGroup.unStub(DefaultActionGroup.java:354)
at com.intellij.openapi.actionSystem.DefaultActionGroup.getChildren(DefaultActionGroup.java:312)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl$5.compute(ActionManagerImpl.java:1315)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl$5.compute(ActionManagerImpl.java:1308)
at com.intellij.openapi.application.impl.ApplicationImpl.runReadAction(ApplicationImpl.java:967)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.preloadActionGroup(ActionManagerImpl.java:1308)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.preloadActionGroup(ActionManagerImpl.java:1323)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.preloadActionGroup(ActionManagerImpl.java:1323)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.preloadActionGroup(ActionManagerImpl.java:1323)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.preloadActionGroup(ActionManagerImpl.java:1302)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.doPreloadActions(ActionManagerImpl.java:1290)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.access$200(ActionManagerImpl.java:77)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl$4.run(ActionManagerImpl.java:1278)
at com.intellij.openapi.application.impl.ApplicationImpl$8.run(ApplicationImpl.java:366)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
at org.jetbrains.ide.PooledThreadExecutor$1$1.run(PooledThreadExecutor.java:55)
Caused by: com.intellij.diagnostic.PluginException: com/shang/layoutformat/LayoutFormat : Unsupported major.minor version 52.0 [Plugin: com.shang.android.layoutformat]
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClassInsideSelf(PluginClassLoader.java:130)
at com.intellij.ide.plugins.cl.PluginClassLoader.tryLoadingClass(PluginClassLoader.java:77)
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClass(PluginClassLoader.java:66)
at java.lang.ClassLoader.loadClass(ClassLoader.java:358)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:270)
at com.intellij.openapi.actionSystem.impl.ActionManagerImpl.convertStub(ActionManagerImpl.java:153)
... 23 more
Caused by: java.lang.UnsupportedClassVersionError: com/shang/layoutformat/LayoutFormat : Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:800)
at java.lang.ClassLoader.defineClass(ClassLoader.java:643)
at com.intellij.util.lang.UrlClassLoader._defineClass(UrlClassLoader.java:260)
at com.intellij.util.lang.UrlClassLoader.defineClass(UrlClassLoader.java:256)
at com.intellij.util.lang.UrlClassLoader._findClass(UrlClassLoader.java:225)
at com.intellij.ide.plugins.cl.PluginClassLoader.loadClassInsideSelf(PluginClassLoader.java:124)
這是因?yàn)槟愕腶ndroid studio 的運(yùn)行時(shí)的jre版本低于我的插件,查看android studio 的 java 版本是在:
菜單欄 > Help > About;
你可以看到JRE:1.8.xx 這個(gè)東西,這個(gè)JRE是讀取你的環(huán)境變量里面配置的java_home ,所以改下吧,提倡大家用最新的1.8的。因?yàn)槲蚁螺dIntellj IDEA 開發(fā)時(shí),它就默認(rèn)我必須要關(guān)聯(lián)1.8的jdk,坑爹啊
最后
感謝LayoutFormatter的作者,然后我想對(duì)作者說(shuō),里面的xml格式化的過(guò)程最好是用dom 或 sax 的方式去解析出來(lái),而不是一行一行的去讀然后判斷,確實(shí)不是很科學(xué)啊。