老师请问下 attr文件

来源:4-6 主界面底部导航栏封装-1

慕用1394343

2019-03-30

我今天去搜了下 创建一个.xml文件 然后定义里面的属性

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <attr name="toolbarTitleColor" format="color" />
    <attr name="toolbarMenuIconColor" format="color" />
    <attr name="toolbarTitleSize" format="dimension" />
</resources>

然后在style 中赋值

<!--初始化自己定义的3个属性值-->
        <item name="toolbarTitleSize">@dimen/font_18</item>
        <item name="toolbarTitleColor">@color/white_alpha_224</item>
        <item name="toolbarMenuIconColor">@color/white_alpha_224</item>

然后 在某个地方通过 ?attr/toolbarTitleColor 调用是吗? 但是我不知到这样有什么便利的吗?
为什么要通过?attr…这样去调用 而不直接在需要用到的地方定义某个具体值呢?

第2个问题 这个就是老师项目中的ids.xml文件

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--Toolbar的默认id名-->
    <item name="toolbar" type="id" />
    <!--recycler封装的tag属性-->
    <item name="tag_recycler_holder" type="id" />
    <!--默认头像的drawable名字-->
    <item name="default_portrait" type="drawable" />
</resources>

这儿的 <item name="toolbar" type="id" /> 我看在老师封装的ToolbarActivity中用到了 .

@Override
    protected void initWidget() {
        super.initWidget();
        initToolbar((Toolbar) findViewById(R.id.toolbar));
    }

这儿的R.id.toolbar没有指定是哪个具体toolbar 的 id值呀 怎么就可以这么用呢?

写回答

2回答

Qiujuer

2019-03-31

其实两个问题都是一个答案。

我们直接说:ToolbarActivity,这个类不用说肯定是一个基类,而不是最终使用的子类。

一般在多module的情况下基类会放到基础的module中进行维护,实际项目的实现类在app module下存放。

那么此时会有一个问题:我想要在基类中使用控件该如何办?

比如上面的toolbar;我们肯定希望在基类中获取到toolbar并且通过获取的控件设置他的行为,这样可以避免子类重复的去做重复的事情;但是这个控件肯定是放到app module下布局的,也就是说我们的base module肯定是不知道这个控件具体的初始化的。

在这样的情况下我们就引入了:ids.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>
    <!--Toolbar的默认id名-->
    <item name="toolbar" type="id" />
    <!--recycler封装的tag属性-->
    <item name="tag_recycler_holder" type="id" />
    <!--默认头像的drawable名字-->
    <item name="default_portrait" type="drawable" />
</resources>

这个文件放到 base module下,这个文件发挥了什么作用?

这个文件定义了基础的资源id;虽然资源并没有,但是id已经有了,在编译时已经在R文件中生成了一份资源id;此时我们直接使用这个资源id去获取资源肯定会出现错误,无法找到资源;但是这并不妨碍我们使用。

所以我们加上了ids后,我们就可以在base module中使用这个id资源了;那么这个资源肯定是无法获取到的,我们的项目是如何解决的呢;这个也简单,我们在app module下的界面布局中写上一个Toolbar控件,命名id的时候我们依然使用:toolbar;此时在编译层面自动的这里的toolbar id值就等于base module中的id值。

既然id值一样,那么我们在base module中获取这个控件就成为了可能。

多谢购买课程哦~祝学习愉快。

0
1
慕用1394343
非常感谢老师,明白了
2019-04-01
共1条回复

Qiujuer

2019-03-31

我得用电脑看看 手机的看代码不行

0
0

手把手开发完整的即时通讯App 客户端+服务端+MVP架构

客户端+服务端+MVP架构+封装思想+主流框架

1749 学习 · 872 问题

查看课程