从cordova config.xml更改Android主题

6
在我们公司,我们使用Ionic Framework和Cordova创建我们的移动应用程序。在开始设计应用程序时,我们遇到了Android主题问题,如何在不触及Ionic构建命令生成的AndroidManifest的情况下设置它。
无论我去哪里查找,都建议从config.xml文件中实现任何自定义,并且永远不要触摸AndroidManifest,但是我似乎找不到关于Android主题的任何方法。
我的问题是:是否有一种方法可以从Config.xml设置应用程序的Android主题,例如Holo主题,而不更改生成的AndroidManifest.xml?
4个回答

13

从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中使用吗? - didil

5

我知道我有点晚了,但是cordova-custom-config插件是专门用来"根据在config.xml中定义的首选项和配置文件数据更新平台配置文件"。

例如:

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

  2. Config.xml:<preference name="android-manifest/application/activity/@android:theme" value="@android:style/Theme.Holo"/>

这将向AndroidManfiset-->应用程序-->活动添加属性"android:theme",其值为:@android:style/Theme.Holo


如何添加自定义主题而不是Android默认主题? - Tripaty Sahu

4
为了避免触及平台目录,您可以使用 cordova hook。我对node不是很擅长,但这里有一些应该能解决问题的东西。首先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);
}

1
我考虑使用钩子,但我们应该向config.xml文件添加一些内容来更改这样的东西。考虑到phonegap构建具有编写自定义xml并合并AndroidManifest.xml的功能。 - Jad Salhani
1
这可以通过钩子完成。在进一步探索后,似乎这个文件添加了一些不错的功能(包括主题):https://github.com/djett41/generator-ionic/blob/master/templates/hooks/after_prepare/update_platform_config.js - laughingpine
1
哦,非常好,我稍微研究了一下生成器,但没有看到这些钩子。这为新的配置可能性打开了大门。感谢您的帮助! - Jad Salhani
1
对于使用@laughingpine的链接钩子的任何人。它运行良好,但请确保检查preferenceMappingData中的Activity名称实际上与AndroidManifest.xml中的节点:manifest>application>activity中列出的Activity相匹配。我们的称为MainActivity,因此我们需要更改4个preferenceMappingData xpath表达式以匹配。 - JimTheDev
我已经在style.xml中创建了一个名为custom_theme的样式。那么我该如何在添加平台时动态地将其添加进去呢? - Tripaty Sahu

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接