【问题标题】:How to change material slider font如何更改材质滑块字体
【发布时间】:2021-06-08 07:01:48
【问题描述】:

如何以编程方式更改material slider气泡字体?

【问题讨论】:

    标签: android kotlin material-components-android rangeslider android-slider


    【解决方案1】:

    目前 (1.3.0) 定义textAppearanceSliderTooltip 使用的字体的唯一方法是使用样式:

    <style name="App.Slider" parent="@style/Widget.MaterialComponents.Slider">
        <item name="labelStyle">@style/App.Tooltip</item>
    </style>
    
    <style name="App.Tooltip" parent="Widget.MaterialComponents.Tooltip">
        <item name="android:textAppearance">@style/TextAppearance.MaterialComponents.Tooltip</item>
    </style>
    

    如果您想使用反射(我不鼓励),您必须访问在 BaseSlider 类中定义的 List&lt;TooltipDrawable&gt; labels
    然后可以使用TooltipDrawable类中定义的setTextAppearancesetTextAppearanceResource方法

    【讨论】:

    • 感谢您的有用解释,滑块之王?
    【解决方案2】:

    您必须覆盖滑块的材质主题。

        <style name="Myslider" parent="@style/Widget.MaterialComponents.Slider">
            <item name="labelStyle">@style/My_Tooltip</item>
            <item name="materialThemeOverlay">@style/ThemeOverlay.Slider</item>
            <item name="android:fontFamily">@font/iransans</item>
        </style>
    
        <style name="My_Tooltip" parent="Widget.MaterialComponents.Tooltip">
            <!-- font for your slider  tooltip -->
            <item name="android:fontFamily">//font</item>
        </style>
    
        <style name="ThemeOverlay.Slider" parent="">
            <item name="android:fontFamily">@font/iransans</item>
        </style>
    

    【讨论】:

    • 谢谢 behrad,+1 但我正在寻找一种编程方式,比如反射。
    【解决方案3】:

    我找到了这个链接;它描述的是在 xml 中创建字体并在布局和小部件中以编程方式使用它。

    fonts in xml

    愚蠢的滑块不公开字体属性。 在测试项目中添加了一个滑块,它是第一个答案与允许以编程方式将自定义滑块添加到视图的代码的组合。

    欢迎提出任何建议。现在,即使我以编程方式将滑块添加到视图中,字体也只会在样式应用于所有滑块时才会改变。真可惜。我最好的猜测是父视图覆盖了自定义字体属性。

    该方法似乎适用于其他小部件。我认为在飞行中这样做会很酷。这类东西的许多应用程序。

    style programmatically

    sample has a slider that almost works

    【讨论】:

    • 感谢您的解释
    【解决方案4】:

    根据Gabriele Mariotti answer,您可以使用反射以编程方式更改滑块字体。您必须访问 BaseSlider 上的私有字段“标签”才能访问“TooltipDrawable”列表,您可以在其中使用自定义 Tooltip TextAppearance 更改每个 TooltipDrawable。

    我为此实现了一个辅助函数:

        @SuppressLint("RestrictedApi")
        public static void changeSliderTypeFace(Slider slider, @StyleRes int textAppearanceStyleResId){
    
            try
            {
                Class baseSliderCls = Slider.class.getSuperclass();
                if (baseSliderCls != null) {
                    Field privateLabelsField = baseSliderCls.getDeclaredField("labels");
                    privateLabelsField.setAccessible(true);
                    List<TooltipDrawable> tooltipDrawableList = (List<TooltipDrawable>) privateLabelsField.get(slider);
                    if(tooltipDrawableList!=null && tooltipDrawableList.size()>0)
                    {
                        for(TooltipDrawable tooltipDrawable : tooltipDrawableList){
                            tooltipDrawable.setTextAppearance(new TextAppearance(slider.getContext(), textAppearanceStyleResId));
                        }
                    }
                }
            }
            catch (NoSuchFieldException | IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    

    你可以像下面这样使用它:

    Slider slider = findViewById(R.id.slider);
    changeSliderTypeFace(slider, R.style.CustomTooltipTextAppearance);
    

    其中 R.style.CustomTooltipTextAppearance 是您在 styles.xml 中定义的自定义工具提示 TextAppearance 样式,如下所示:

    <style name="CustomTooltipTextAppearance" parent="TextAppearance.MaterialComponents.Tooltip">
            <item name="android:textColor">@android:color/white</item>
            <item name="fontFamily">@font/roboto_mono</item>
            <item name="android:fontFamily">@font/roboto_mono</item>
    </style>
    

    结果:

    【讨论】:

    • 我还没有测试过,但它似乎工作正常
    猜你喜欢
    • 2019-04-22
    • 2017-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-03
    • 2019-04-11
    • 2019-05-10
    相关资源
    最近更新 更多