【问题标题】:Change android theme from cordova config.xml从 cordova config.xml 更改 android 主题
【发布时间】:2015-04-07 11:51:49
【问题描述】:

在我的公司,我们正在使用 Ionic Framework 和 Cordova 创建我们的移动应用程序,在开始设计应用程序时,我们遇到了 Android 主题以及如何在不触及由 Ionic build 命令生成的 AndroidManifest 的情况下设置它的问题.

我所看到的任何地方都建议从 config.xml 文件实现任何自定义,并且永远不要触摸 AndroidManifest,但我似乎找不到任何有关 Android 主题的方法。

我现在向您提出的问题:有没有办法在不更改生成的 AndroidManifest.xml 的情况下从 Config.xml 为应用程序设置 android 主题,例如 Holo 主题?

【问题讨论】:

    标签: android xml cordova ionic


    【解决方案1】:

    从 6.3.0 开始,您现在可以在没有任何第三方插件的情况下执行此操作。只需将其添加到 config.xml

    <platform name="android">
        <edit-config file="AndroidManifest.xml" target="/manifest/application/activity[@android:label='@string/activity_name']" mode="merge">
            <activity android:theme="@android:style/Theme.Translucent"></activity>
        </edit-config>
    </platform>
    

    对我来说,添加 'xmlns:android="http://schemas.android.com/apk/res/android" ' 到小部件标签也是必要的

    <widget id="de.bestellkind.restaurant" version="1.0.0" xmlns:android="http://schemas.android.com/apk/res/android" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    

    【讨论】:

    • 它说“AAPT:错误:资源 android:style/Theme.Translucent.NoActionBar 未找到。”。它适用于 Ionic 4 吗?
    【解决方案2】:

    我知道我迟到了,但 cordova-custom-config 插件只是为了“根据 config.xml 中定义的首选项和配置文件数据更新平台配置文件。”

    例如:

    1. 安装cordova-custom-config插件:cordova plugin add cordova-custom-config --save

    2. Config.xml:&lt;preference name="android-manifest/application/activity/@android:theme" value="@android:style/Theme.Holo"/&gt;

    这会将属性“android:theme”添加到您的 AndroidManfiset --> 应用程序 --> 活动中,其值为:@android:style/Theme.Holo

    【讨论】:

    • 如何添加自定义主题而不是android默认主题?
    【解决方案3】:

    为避免接触平台目录,您可以使用 cordova hook。我在节点上很糟糕,但这里应该可以解决问题。首先npm install elementtree 然后在hooks 文件夹中创建一个子文件夹after_prepare。从那里将此代码粘贴到 javascript 文件中并更改 YourTheme。

    老实说,这是一些非常粗俗的代码,但应该会给你一些想法。

    #!/usr/bin/env node
    var fs = require( "fs" );
    var et = require('elementtree');
    var rootdir = process.argv[2];
    console.log(rootdir);
    fs.open(rootdir + '/platforms/android/AndroidManifest.xml', 'r+',
        function (err, fd)  {
            if (err) {
                exitError(err);
            }
            fs.stat(rootdir + '/platforms/android/AndroidManifest.xml', getStats);
    
            function getStats(error, stats) {
                if (error) {
                    exitError(error);
                }
                var buffer = new Buffer(stats.size);
                fs.read(fd, buffer, 0, buffer.length, null, fileRead);
            }
    
            function fileRead(error, bytes, buf) {
                var data = buf.toString("utf8", 0, buf.length);
                var androidXML = et.parse(data);
                var root = androidXML.getroot();
                var activityTag = root.find("application/activity");
                activityTag.attrib["android:theme"] = "@style/YourTheme";
                var outputBuffer = new Buffer(et.tostring(root), "utf-8");
                console.log(outputBuffer.toString());
                fs.closeSync(fd);
                fs.open(rootdir + '/platforms/android/AndroidManifest.xml', 'w', writeFile);
                function writeFile(error, fd) {
                    if (error) {
                        exitError(error);
                    }
                    fs.write(fd, outputBuffer, 0, outputBuffer.length, 0, function( errw, written, str) {
                        if (errw) {
                            exitError(errw);
                        }
                        console.log('file written');
                        fs.close(fd);
                    });
                }
    
            }
        });
    
    function exitError(error) {
        console.log(error);
        process.exit(0);
    }
    

    【讨论】:

    • 我考虑过使用钩子,但我们不应该在 config.xml 文件中添加一些东西来改变这样的事情吗?考虑到 phonegap 构建具有编写自定义 xml 的功能,该功能将与 AndroidManifest.xml 合并
    • 同样,这可以通过钩子来完成。经过一番探索,这个文件似乎增加了一些不错的功能(包括主题):github.com/djett41/generator-ionic/blob/master/templates/hooks/…
    • 哦,太好了,我用发电机戳了一下,但没有看到这些钩子。它为新的配置可能性打开了大门。感谢您的帮助!
    • 对于任何使用@laughingpine 的链接钩子的人。它运行良好,但请确保检查以确保 preferenceMappingData 中的 Activity 名称实际上与节点中列出的 Activity 匹配:AndroidManifest.xml 中的 manifest>application>activity。我们的称为 MainActivity,因此我们需要更改 4 个 preferenceMappingData xpath 表达式以匹配。
    • 我在 style.xml 中创建了一种样式,即 custom_theme。那么如何在添加平台的同时动态添加呢?
    【解决方案4】:

    您可以使用 Header Color 插件:

    安装插件:

    $ ionic cordova plugin add cordova-plugin-headercolor $ npm install --save @ionic-native/header-color

    将配置添加到 config.xml <preference name="HeaderColor" value="#becb29" />

    https://ionicframework.com/docs/native/header-color/

    【讨论】:

      猜你喜欢
      • 2017-03-19
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-08
      • 1970-01-01
      相关资源
      最近更新 更多