AndroidManifest

object Utils {

fun showText(context: Context) {

Toast.makeText(context, R.string.app_name, Toast.LENGTH_SHORT).show()

}

fun reflect(): String {

val appNameField = Class.forName(“a.a.aaa.R.string”).getField(“app_name”)

return appNameField.get(null) as String

}

}

这里我们使用到了反射,通过反射获取一个R.string类中的app_name变量。

接下来,我们直接手动修改AndroidManifest.xml中的package的值为:a.a.bbb,然后就会发现有3个地方报错了,如下:

在这里插入图片描述

这是因为,.MainActivity前面的那个点,代表以package中声明的包名作为前缀的,现在我们改在了a.a.bbb,所以就报错了,因为a.a.bbb.MainActivity并不存在,所以这里只能使用全包名形式了:a.a.aaa.MainActivity

第二个报错,MainActivity:

在这里插入图片描述

前面我们说了package中的包名用于指定自动生成的类所在的包,没修改之前,a.a.aaa.R.layout.activity_main和a.a.aaa.MainActivity在同一个包下,所以不用导包,修改之后,自动生成的activity_main为a.a.bbb.R.layout.activity_main和a.a.aaa.MainActivity不在同一个包下了,所以需要导包:import a.a.bbb.R

第三个报错,Utils:

在这里插入图片描述

容易理解,R文件已经不在a.a.aaa包下,所以这里会报错,而且这里的反射我们也需要手动修改包名,如果是一个真实的项目,类很多,那要这样手动改的话,真是要累死人的,所以要使用重构的方式,我们把代码还原一下,然后在aaa包名上点击一下,然后按下Shift + F6,此时会弹出一个警告对话框,如下:

在这里插入图片描述

这个汉化的内容我感觉不太对,于是关闭汉化插件再看一下对话框,如下:

在这里插入图片描述

根据我试验的结果,此对话框提示a.a.aaa目录在3个地方都有,一个是我们的android主项目src\main\java\a\a\aaa,一个是对应的Android测试目录src\androidTest\java\a\a\aaa,一个是对应的java测试目录src\java\a\a\aaa,对话框问我们是想要重命名整个包还是只重命名src\main\java\a\a\aaa这一个目录?重构整个包名会重构到上面说的3个目录。

我们先使用“重命名目录”按钮,出现如下对话框:

在这里插入图片描述

我们输入bbb,然后点击“预览”按钮,此时会在AndroidStudio的底部出现“重构预览”即在发生重构前,先让你知道重构会改变哪些地方,如下:

在这里插入图片描述

可以看到,有两个地方会被修改,第一个是告诉你MainActivity.kt文件会被移动到a.a.bbb目录,第二个是告诉你MainActivity.kt中的package a.a.aaa也会改成package a.a.bbb,这也很容易理解,因为MainActivity已经放到a.a.bbb目录下了,当然package也要改成对应的包。感觉上因为就真的只有这两个地方会被修改,但是ide会做的更多,我们点击“执行重构”,然后提交代码(我提前把代码放到SVN上了),然后就能看到有哪些改动了,如下:

在这里插入图片描述

我们发现,activity_main.xml和AndroidManifest.xml中也有改动,如下:

activity_main.xml:

在这里插入图片描述

AndroidManifest.xml:

在这里插入图片描述

还挺智能的,它知道MainActivity的位置变了,不在相对于a.a.aaa的位置了,所以需要使用全包名的形式。

很明显,这种方式不是我们想要的,它并没有为我们重命名清单文件中的package属性。我们把代码还原,然后再执行重构,这次我们选择“重命名包”按钮,然后出现对话框,如下:

在这里插入图片描述

我们把aaa改成bbb,然后点击预览按钮,如下:

在这里插入图片描述

双击对应的条目即可快速跳转到相应的位置,比如双击最前面的aaa,我们发现它被定位到主项目的aaa目录,如下:

在这里插入图片描述

这里工具有点问题,有两个aaa都指向了同一个地方,另外两个aaa分别指向对应的Android测试目录和Java测试目录,如下:

在这里插入图片描述

在这里插入图片描述

再往下,这3个目录中对应了3个类,所以类里面的package语句中的包肯定也是要修改的,再往下是清单文件中package的值也会被修改,最后是Utils中使用到了import a.a.aaa.R也会被修改,因为package的值修改了,则自动生成的R对应的包肯定也是需要修改的,但是我们代码中反射使用到了a.a.aaa啊,它不给我重构一下吗?我们取消这次的重构预览,重新执行重构,如下:

在这里插入图片描述

这次我们勾选了“在注释和字符中搜索”,再次预览,结果如下:

在这里插入图片描述

这还不错啊,找到了我们反射的字符串了,但是同时问题也来了,还会找到了更多我们不想要重构的地方,如下:

在这里插入图片描述

这里的项目名称和应用的进程名,我们并不想改,甚至在jdk和sdk中的一些注释或字符串它也改搜索出来了,如下:

在这里插入图片描述

对于搜索到jdk和sdk的问题还好解决,在重构对话框中,我们可以在“范围”的地方选择“项目文件”即可,但是它仍然会重构到settings.gradle中的项目名,还有build.gradle中的applicationId,这很简单,我们可以重构完成之后,提交代码,在提交修改对话框中找到这些重构错误的地方还原好可。当然,如果你发现重构错误的地方很多,而你又没有在代码中使用反射,那你可以在重构的时候不要勾选“在注释和字符串中搜索”,或者你有使用反射,但是很少,则可以勾上“在注释和字符串中搜索”然后预览,预览找到使用反射的地方,记下来,取消预览,再次重构时不要勾“在注释和字符串中搜索”,直接重构,然后手动去改反射的那个地方即可,这样的话工作量也非常少。

最后

下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术

高级UI,自定义View

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。

不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!

[外链图片转存中…(img-obO7HoCy-1723545179212)]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值