问题
今天在乱写乱划的时候弄出来一个bug,在写一个OptionMenu的时候item的一个属性不起作用了,如下
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
...
app:showAsAction="always" />
</menu>
设置菜单的item永远可见,但是但是但是!跑了一下程序菜单还是右上角的三个点...,百度了一下,发现网上都说把android改为app,然而我本来就是app。那我反过来试试,把app改为android,结果好了,item出现了。
但是这是怎么回事呢?
简单分析
item不显示的问题解决后,xml文件出现了一条红线,鼠标移过去看看:
Should use app:showAsAction with the appcompat library with xmlns:app="http://schemas.android.com/apk/res-auto"
意思是他认为这个属性应该以app开头来配合兼容库,那我用了啥,回头一看,原来的我的活动继承的是Activity,不是AppCompatActivity,所以,这就是原因咯?
靠,那app和android到底是什么鬼?查查吧。
命名空间
XML 命名空间提供避免元素命名冲突的方法,不同空间内可能会有一样名字的元素,通过起别名就可以区分元素属于哪个空间
在android中有三种命名空间(xmlns:即xml namespace):
- xmlns:android=”http://schemas.android.com/apk/res/android”
- xmlns:tools=”http://schemas.android.com/tools”
- xmlns:app=”http://schemas.android.com/apk/res-auto”
android
安卓提供的属性可以在这里找到
app
自定义的属性可以在这里找到
tools
这个命名空间表示该属性只在开发期间有效,就是说,在IDE内这个属性是有效的,但是当app在手机上运行时,tools开头的属性实际上是被删除的
结尾
上面说的命名空间可以不叫android,tools,app,这些名字是可以随便起的,只要URI是对的就没问题