How to change Custom Font of Android Menu Item?

前端 未结 10 1881
夕颜
夕颜 2020-12-05 02:17

I have the following Android Java and XML code. I want to change the font of Menu Items of my app. I know only that we can change the font of TextView using setTypeface but

相关标签:
10条回答
  • 2020-12-05 02:54

    The answer by @brahmyadigopula works well.

    Here is just a more complete version for the sake of simplification:

    The Menu

    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools">
        <item
            android:id="@+id/update"
            android:showAsAction="always"
            android:title="@string/menu_update"
            tools:ignore="UnusedAttribute"
            android:actionViewClass="android.widget.Button"/>
    </menu>
    

    In your Activity or Fragment:

            // Inflater the menu based on the layout above
            inflater.inflate(menuRes, menu);
    
    
            // Set font type face
            if (setCustomFontType){
                final MenuItem menuItem = menu.findItem(R.id.update);
                String title = menuItem.getTitle().toString();
    
                Button button_menu = (Button) menuItem.getActionView();
                button_menu.setTypeface("<REPLACE_WITH_FONT_NAME>");
                button_menu.setText(title);
                button_menu.setTextColor(Color.WHITE);
                button_menu.setBackgroundColor(_getResources().getColor(R.color.transparent_color));
                button_menu.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        onOptionsItemSelected(menuItem);
                    }
                });
            }
    
            super.onCreateOptionsMenu(menu, inflater);
    
    0 讨论(0)
  • 2020-12-05 02:58

    XML

    <?xml version="1.0" encoding="utf-8"?>
        <menu xmlns:android="http://schemas.android.com/apk/res/android"
            xmlns:app="http://schemas.android.com/apk/res-auto">
    
            <item
                android:id="@+id/action_edit"
                android:title="@string/edit"
                android:visible="true"
                app:showAsAction="always" />
        </menu>
    

    IN ACTIVITY OR IN FRAGMENT

    @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {
    
                Typeface face = Typeface.createFromAsset(getActivity().getAssets(),"fonts/OpenSans-Regular.ttf");    //  THIS
                TypefaceSpan face = new TypefaceSpan("<REPLACE_WITH_FONT_NAME>"); // OR  THIS 
                SpannableStringBuilder title = new SpannableStringBuilder(getContext().getString(R.string.edit));
                title.setSpan(face, 0, title.length(), 0);
                menu.add(Menu.NONE, R.id.action_edit, 0, title); // THIS 
                MenuItem menuItem = menu.findItem(R.id.action_edit); // OR THIS 
                menuItem.setTitle(title);
            super.onCreateOptionsMenu(menu, inflater);
        }
    
    0 讨论(0)
  • 2020-12-05 03:00

    If you are using android.support.design library then

    app:itemTextAppearance="@style/bottom_navigation_textappreance"

    above will work but if you are using Material design the below properties will work

    app:itemTextAppearanceActive="@style/bottom_navigation_textappreance" app:itemTextAppearanceInactive="@style/bottom_navigation_textappreance"

    <style name="bottom_navigation_textappreance" parent="Widget.Design.BottomNavigationView"> <item name="fontFamily">@font/fira_sans_bold</item> </style>

    0 讨论(0)
  • 2020-12-05 03:04

    If your app only needs to work on Android Pie (API level 28) and above you can construct a TypefaceSpan from a Typeface in onPrepareOptionsMenu. Otherwise you can use a CustomTypefaceSpan class like this answer suggests:

    public boolean onPrepareOptionsMenu(Menu menu) {
        int customFontId = R.font.metropolis_medium;
        for (int i = 0; i < menu.size(); i++) {
            MenuItem menuItem = menu.getItem(i);
            String menuTitle = menuItem.getTitle().toString();
            Typeface typeface = ResourcesCompat.getFont(this, customFontId);
            SpannableString spannableString = new SpannableString(menuTitle);
            // For demonstration purposes only, if you need to support < API 28 just use the CustomTypefaceSpan class only.
            if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.P) {
                TypefaceSpan typefaceSpan = typeface != null ?
                        new TypefaceSpan(typeface) :
                        new TypefaceSpan("sans-serif");
                spannableString.setSpan(typefaceSpan, 0, menuTitle.length(), 
                        Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            } else {
                CustomTypefaceSpan customTypefaceSpan = typeface != null ?
                        new CustomTypefaceSpan(typeface) :
                        new CustomTypefaceSpan(Typeface.defaultFromStyle(Typeface.NORMAL));
                spannableString.setSpan(customTypefaceSpan, 0, menuTitle.length(),
                        Spanned.SPAN_EXCLUSIVE_INCLUSIVE);
            }
            menuItem.setTitle(spannableString);
        }
        return true;
    }
    

    main.menu.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/settings"
            android:onClick="openSettings"
            android:title="@string/settings"
            app:showAsAction="never" />
        <item
            android:id="@+id/about"
            android:onClick="openAbout"
            android:title="@string/about"
            app:showAsAction="never" />
    </menu>
    

    Before & After:

    Before & After

    0 讨论(0)
  • 2020-12-05 03:08

    Create Style in styles.xml

     <style name="Style_TextView">
                <item name="fontFamily">@font/myriadproregular</item>
     </style>
    

    Add Below code into android.support.design.widget.NavigationView

     app:itemTextAppearance="@style/Style_TextView"
    

    Note: It works for android.support.design.widget.NavigationView

    0 讨论(0)
  • 2020-12-05 03:08

    You can also use a SpannableStringBuilder when you add a menu item with a TypefaceSpan. For each menu item do something like

    TypefaceSpan span = new TypefaceSpan("<REPLACE_WITH_FONT_NAME>");
    SpannableStringBuilder title = new SpannableStringBuilder("My Menu Item Title");
    title.setSpan(span, 0, title.length(), 0);
    menu.add(Menu.NONE, id, index, title);
    
    0 讨论(0)
提交回复
热议问题