Funui-Theme 资源的替换

实现资源的替换,需要分为以下几个步骤

1.找到需要更改的模块 mediatek/packages/apps/FileManager

2.到主题模块下根据包名找到相应资源(以Grass为例) cd vendor/themes/Grass/values com_mediatek_filemanager_colors com_mediatek_filemanager_styles

代码如下

com_mediatek_filemanager_styles

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <style name="FileManager.Theme" parent="@android:style/Theme.Funui">
        <item name="*android:searchViewTextColor">@color/search_color</item>
        <item name="*android:searchViewTextColorHint">@color/search_hint_color</item>
        <item name="*android:searchViewSearchIcon">@drawable/com_mediatek_filemanager_search_image</item>
    </style>

    <style name="FileManager.Theme.NoActionBar" parent="@android:style/Theme.Funui.NoActionBar">
    </style>
</resources>

com_mediatek_filemanager_colors

<?xml version="1.0" encoding="UTF-8"?>
<resources>
    <color name="item_selected_color">#7fed6f00</color>
    <color name="action_text_select_color">#ffffff</color>
    <color name="search_color">#000000</color>
    <color name="search_hint_color">#919192</color>
</resources>

讲解一下这个Theme的工作原理

theme主要就是通过应用的包名来识别应用处理的。首先当一个应用工作的时候,这个主题就会查看自己目录下是否有这个应用的包名文件,然后从这个包名文件中选择相应的资源去替换到应用中的同名或者加了包名的资源。当然,这个资源可以是图片,也可以是style,color等

注意:主题下的资源可以替换相应应用的,但是,主题却不可引用相应应用下的资源。例如<item name="*android:searchViewTextColorHint">@color/search_hint_color_aa</item>  search_hint_color_aa 是filemanager下的颜色,这样是会报错的。你想替换或者使用的资源,必须在这个theme下添加 (图片-drawable* 共用的  颜色-自己相应包名应用下*color style-自己相应包名下的*style)

3.当你添加了资源以后,你需要执行一下p2x c 这个命令的作用,其实就是在xml目录下的com_mediatek_filemanager.xml里面注册你添加的新的资源信息

<?xml version="1.0" encoding="utf-8"?>
<resource-redirections>
    <item name="color/action_text_select_color">@color/action_text_select_color</item>
    <item name="color/item_selected_color">@color/item_selected_color</item>
    <item name="color/search_color">@color/search_color</item>
    <item name="color/search_hint_color">@color/search_hint_color</item>
    <item name="drawable/action_bar_background_pressed">@drawable/com_mediatek_filemanager_action_bar_background_pressed</item>
    <item name="drawable/app_filemanager">@drawable/com_mediatek_filemanager_app_filemanager</item>
    <item name="drawable/dropdown_ic_arrow_normal_holo_dark">@drawable/com_mediatek_filemanager_dropdown_ic_arrow_normal_holo_dark</item>
    <item name="drawable/fm_copy">@drawable/com_mediatek_filemanager_fm_copy</item>
    <item name="drawable/fm_cut">@drawable/com_mediatek_filemanager_fm_cut</item>
    <item name="drawable/fm_delete">@drawable/com_mediatek_filemanager_fm_delete</item>
    <item name="drawable/fm_home_focus">@drawable/com_mediatek_filemanager_fm_home_focus</item>
    <item name="drawable/fm_home_ninepatch_focus">@drawable/com_mediatek_filemanager_fm_home_ninepatch_focus</item>
    <item name="drawable/fm_tab_focus">@drawable/com_mediatek_filemanager_fm_tab_focus</item>
    <item name="drawable/search_image">@drawable/com_mediatek_filemanager_search_image</item>
    <item name="style/FileManager.Theme.NoActionBar">@style/FileManager.Theme.NoActionBar</item>
    <item name="style/FileManager.Theme">@style/FileManager.Theme</item>
</resource-redirections>

这个文件就是上面原理的依据,它就是通过查找这个文件来决定是否替换一个资源的。这个当然可以手动添加,当然,为了使用p2x c 自动添加文件到xml中,我们命名的时候,尽量使用原名,或者在原名前面添加相应的包名。你会发现,执行p2x c以后,它生成的文件,会自动去点包名。例如

color中添加:<color name="com_mediatek_filemanager_aaa_color">#323232</color>

p2x c

在xml中生成:<item name="color/aaa_color">@color/com_mediatek_filemanager_aaa_color</item>

意义:应用下的aaa_color会替换为theme下的com_mediatek_filemanager_aaa_color

原文地址:https://www.cnblogs.com/zhangshuli-1989/p/zhangshuli_theme_15020511.html