【问题标题】:How to ignore font-size setting changes for Cordova App when runs on Android 4.4+?在 Android 4.4+ 上运行时如何忽略 Cordova App 的字体大小设置更改?
【发布时间】:2014-12-07 18:33:22
【问题描述】:

我使用 Cordova 版本 3.6.3 和 JQuery 开发了 Cordova 应用程序。我仍然无法获得最佳解决方案的唯一一个问题是,当我在 Android 4.4+ 上测试我的应用程序时,有些用户喜欢在其设备的设置 > 显示 > 字体大小中更改字体大小,使其大于正常大小.它会导致我的应用程序布局显示丑陋(最好的显示是仅当字体大小设置正常时)。但是对于早于 4.4 (4.3,4.2...) 的 Android,字体大小设置没有影响,因此该应用在旧版本上完美显示。

我应用到我的应用程序的解决方案是创建自定义插件来检测配置更改,它会检测用户是否使用 Android 4.4+,如果他们将字体大小设置设置为任何不正常的设置,我会使用 JQuery 强制 font-size 为指定大小。

例子是....

if (font_scale == huge)
{
    $("div").css("font-size","20px !important");
}

这可以正常工作,但有时在页面加载后,css 不会按我的意愿更改。并假设如果该页面上有 30 个 div+,那么我必须插入 30 次以上的语句,这会不必要地花费太多时间。

我只是想知道,有没有比使用这个插件更容易解决这个问题的其他方法?也许使用一些 XML 配置或 CSS3 属性可以使我的应用正常显示,而不会受到 Android 4.4 的字体大小设置的副作用?

我也尝试过但不起作用的另一种方法是

  1. 在 Androidmanifest.xml 上插入 fontScale > 活动标签
  2. 插入 webkit-text-size-adjust:none;在 CSS 中

我很想听听任何有助于解决这个问题的想法。

【问题讨论】:

  • 如果我的回答有帮助,请选择它作为答案。这样可以帮助其他人。

标签: android jquery cordova android-4.4-kitkat


【解决方案1】:

所以你只想忽略系统字体偏好。 这是解决方案,我使用MobileAccessibilty Plugin 忽略系统字体偏好。

您只需在 index.js 的 onDeviceReady 函数中编写以下代码

if(window.MobileAccessibility){
    window.MobileAccessibility.usePreferredTextZoom(false);
}

usePreferredTextZoom(false) 将忽略系统字体首选项。 :) :) :)

【讨论】:

  • 反应原生有什么方法或方法吗??
  • 自 2020 年初以来,该选项不再适用于多款 Android 设备..
  • @moomoo 你找到解决方案了吗?
  • @PostImpatica 仍在寻找解决方案。你呢?
  • @PostImpatica Paulo Henrique Arruda 下面的回答对我有用。
【解决方案2】:

我希望这会有所帮助!

在 Cordova 8.0 中:

编辑 MainActivity.java

在文件头中添加引用:

import android.webkit.WebView;
import android.webkit.WebSettings;

在loadUrl方法后添加代码:

loadUrl(launchUrl);

WebView webView = (WebView)appView.getEngine().getView();
WebSettings settings = webView.getSettings();

settings.setTextSize(WebSettings.TextSize.NORMAL);

只有这种方法对我有用。

【讨论】:

  • 谢谢!您找到适用于 iOS 的解决方案了吗?
  • 这行得通,应该是公认的答案!
  • 拯救我的一天,安卓 8+ 的完美答案。码!
【解决方案3】:

尝试从你的 index.html 中删除这个:

target-densitydpi=device-dpi

祝你好运。

【讨论】:

    【解决方案4】:

    这是一个新的解决方案,希望它可以帮助你。 Solution

     //in base activity add this code.
    public  void adjustFontScale( Configuration configuration) {
    
        configuration.fontScale = (float) 1.0;
        DisplayMetrics metrics = getResources().getDisplayMetrics();
        WindowManager wm = (WindowManager) getSystemService(WINDOW_SERVICE);
        wm.getDefaultDisplay().getMetrics(metrics);
        metrics.scaledDensity = configuration.fontScale * metrics.density;
        getBaseContext().getResources().updateConfiguration(configuration, metrics);
    
    }
    
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        adjustFontScale( getResources().getConfiguration());
    }
    

    【讨论】:

      【解决方案5】:
      1. 如果您的插件允许您知道字体比例,请将所有字体大小更改为 em 并使用 $(document.body).css("font-size","70%"); 只有一次。

      2. 您介意分享您的插件吗?

      【讨论】:

        【解决方案6】:

        这已经很老了,但因为我在 2019 年仍然需要​​它,所以其他人可能也需要它。

        如果由于某种原因您不想(或不能)为单个功能集成整个插件,这里是提取的 usePreferredTextZoom(false) 功能(它来自基于 Cordova 的 MobileFirst 7.1 应用程序)。当然,所有功劳都归功于开发插件的人。

        在您的 Cordova Android 应用程序的主 Java 文件中,通过添加 preventDeviceZoomChange() 方法调用来更改 onInitWebFrameworkComplete 方法:

        public void onInitWebFrameworkComplete(WLInitWebFrameworkResult result){
            if (result.getStatusCode() == WLInitWebFrameworkResult.SUCCESS) {
                super.loadUrl(WL.getInstance().getMainHtmlFilePath());
                preventDeviceZoomChange();
            } else {
                handleWebFrameworkInitFailure(result);
            }
        }
        

        在同一个类中,定义preventDeviceZoomChange()方法:

        private void preventDeviceZoomChange() {
            try {
                Method getSettings = (this.appView).getClass().getMethod("getSettings");
                Object wSettings = getSettings.invoke(this.appView);
                Method setTextSize = wSettings.getClass().getMethod("setTextSize", WebSettings.TextSize.class);
                setTextSize.invoke(wSettings, WebSettings.TextSize.NORMAL);
            } catch (NoSuchMethodException e) {
                e.printStackTrace();
            } catch (InvocationTargetException e) {
                e.printStackTrace();
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2023-01-22
          • 1970-01-01
          • 1970-01-01
          • 2012-02-08
          • 1970-01-01
          • 2012-02-17
          • 2012-10-10
          • 2021-10-26
          • 1970-01-01
          相关资源
          最近更新 更多