【问题标题】:How to change font size and colour in androidx drawer layout widget如何在 androidx 抽屉布局小部件中更改字体大小和颜色
【发布时间】:2021-11-28 04:11:20
【问题描述】:

见下图我想更改放置在菜单中的标记页脚区域文本的字体大小和颜色。我不想使用android.support.design.widget.NavigationView,我知道我可以通过使用它来更改它。请帮帮我。

如果有其他方法可以添加页脚区域,就像我们设置页眉区域属性(app:headerLayout="@layout/nav_header_main")一样?

这是我的主要 XML 代码:

<?xml version="1.0" encoding="utf-8"?>
<androidx.drawerlayout.widget.DrawerLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/drawer_layout"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fitsSystemWindows="true"
    tools:openDrawer="start">

    <include
        layout="@layout/app_bar_main"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <com.google.android.material.navigation.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        android:theme="@style/menuTextStyle"
        android:background="@color/colorBlack"
        app:itemTextColor="@color/colorWhite"
        app:itemIconTint="@color/colorWhite"
        app:headerLayout="@layout/nav_header_main"
        app:menu="@menu/activity_main_drawer" />
</androidx.drawerlayout.widget.DrawerLayout>

这里是activity_main_drawer.xml代码:

<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    tools:showIn="navigation_view">

    <group android:checkableBehavior="single">
        <item
            android:id="@+id/nav_home"
            android:title="Home" />
        <item
            android:id="@+id/nav_my_pets"
            android:title="My Pets" />
        <item
            android:id="@+id/nav_my_stores"
            android:title="My Stores" />
        <item
            android:id="@+id/nav_my_products"
            android:title="My Products" />
        <item
            android:id="@+id/nav_promotions"
            android:title="Promotions" />
        <item
            android:id="@+id/nav_faqs"
            android:title="FAQs" />

        <item
            android:id="@+id/nav_account"
            android:title="My Account" />
        <item
            android:id="@+id/nav_notifications"
            android:title="Notifications" />
        <item
            android:id="@+id/nav_about"
            android:title="About" />
        <item
            android:id="@+id/nav_settings"
            android:title="Settings"
            android:visible="false" />
        <item
            android:id="@+id/nav_forum"
            android:title="Forum" />
        <item
            android:id="@+id/nav_terms"
            android:title="Privacy/Terms" />
        <item
            android:id="@+id/nav_logout"
            android:title="Logout" />
    </group>
    <group android:checkableBehavior="none">
            <item
                android:id="@+id/subtitle2"
                android:title="by:">
                <menu>
                    <item
                        android:id="@+id/nav_footer1"
                        android:checkableBehavior="none"
                        android:title="by:" />
                    <item
                        android:id="@+id/nav_footer2"
                        android:checkableBehavior="none"
                        android:title="afterdarkgrafx.com" />
                </menu>
            </item>
    </group>
</menu>

【问题讨论】:

    标签: android xml android-layout navigation-drawer navigationview


    【解决方案1】:

    您可以使用:

    // Java
    private void setMenuTextSize(MenuItem item, float proportion) {
        SpannableString spanString = new SpannableString(item.getTitle().toString());
        spanString.setSpan(new RelativeSizeSpan(proportion), 
                              0, spanString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        item.setTitle(spanString);
    }
    
    // Kotlin
    private fun setMenuTextSize(item: MenuItem, proportion: Float) {
        val spanString = SpannableString(item.title.toString())
        spanString.setSpan(
            RelativeSizeSpan(proportion),
            0, spanString.length, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
        item.title = spanString
    }
    
    // Java
    private void setMenuTextSize(MenuItem item, int textSize) {
        SpannableString spanString = new SpannableString(item.getTitle().toString());
        spanString.setSpan(new AbsoluteSizeSpan(textSize), 0, spanString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        item.setTitle(spanString);
    }
    
    // Kotlin
    private fun setMenuTextSize(item: MenuItem, textSize: Int) {
        val spanString = SpannableString(item.title.toString())
        spanString.setSpan(
            AbsoluteSizeSpan(textSize),
            0,
            spanString.length,
            Spannable.SPAN_EXCLUSIVE_EXCLUSIVE
        )
        item.title = spanString
    }
    

    从 sp 转换为像素:

    // Java
    public static int spToPx(int sp) {
        return (int) (sp * Resources.getSystem().getDisplayMetrics().scaledDensity);
    }
    
    // Kotlin 
    fun spToPx(sp: Int) = (sp * Resources.getSystem().displayMetrics.scaledDensity).toInt()
    

    在您的菜单上应用它:

    // Java
    private void reduceItemSize(NavigationView navView) {
        Menu menu = navView.getMenu();
        MenuItem item = menu.findItem(R.id.subtitle2);
        SubMenu subMenu = item.getSubMenu();
        MenuItem footer1Item = subMenu.findItem(R.id.nav_footer1);
        MenuItem footer2Item = subMenu.findItem(R.id.nav_footer2);
    
        // Using RelativeSizeSpan
        setMenuTextSize(footer1Item, 0.8f);
        setMenuTextSize(footer2Item, 0.8f);
    
        // Using AbsoluteSizeSpan
        setMenuTextSize(footer1Item, spToPx(12));
        setMenuTextSize(footer2Item, spToPx(12));
    }
    
    // Kotlin
    private fun reduceItemSize(navView: NavigationView) {
        val menu = navView.menu
        val item = menu.findItem(R.id.subtitle2)
        val subMenu = item.subMenu
        val footer1Item = subMenu.findItem(R.id.nav_footer1)
        val footer2Item = subMenu.findItem(R.id.nav_footer2)
    
        // Using RelativeSizeSpan
        setMenuTextSize(footer1Item, 0.8f)
        setMenuTextSize(footer2Item, 0.8f)
    
        // Using AbsoluteSizeSpan
        setMenuTextSize(footer1Item, spToPx(12))
        setMenuTextSize(footer2Item, spToPx(12))
    }
    

    【讨论】:

    • @Gitesh Cool.. 另外请注意有ForegroundColorSpan,您可以尝试更改菜单项的颜色
    • 将使用 ForegroundColorSpan 更改颜色,谢谢!
    • 效果很好,谢谢!
    猜你喜欢
    • 2020-04-16
    • 2018-08-22
    • 2016-07-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    相关资源
    最近更新 更多