How to change Custom Font of Android Menu Item?

前端 未结 10 1882
夕颜
夕颜 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 03:09

    I found this solution is usefull for me .hope it will help full new surfers.

    your menu main.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/item1"
      android:title="User"
      android:orderInCategory="100"
      android:visible="true"
      app:showAsAction="always"
      app:actionViewClass="android.widget.Button"
    />
    </menu>
    

    After you inflated the custom menu, you can make a reference to the item of the menu. When you obtain the reference to the menu item, you will be able to customize the item to show icon and Unicode text. Your icon image file has to be stored in the

    res/drawable folder.

    @Override
       public boolean onCreateOptionsMenu(Menu menu) {
         // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
    
       //reference to the item of the menu
       MenuItem i=menu.findItem(R.id.item1);
       Button button_menu =(Button) i.getActionView();
    
       if(itemuser!=null){
       // Create Typeface object to use unicode font in assets folder
       Typeface font= Typeface.createFromAsset(getApplicationContext().getAssets(),"fonts/arial.ttf");
       // Set unicode font to menu item
       button_menu .setTypeface(font);  
       // Set item text and color
       button_menu .setText(getResources().getString(R.string._text));
       button_menu .setTextColor(Color.WHITE);
       // Make item background transparent
       button_menu .setBackgroundColor(Color.TRANSPARENT);
       // Show icon next to the text
       Drawable icon=getApplicationContext().getResources().getDrawable( R.drawable.user);
       button_menu .setCompoundDrawablesWithIntrinsicBounds( icon, null, null, null );
    }
    
    return true;
    
       }
    
    0 讨论(0)
  • 2020-12-05 03:12

    Just add the font of your choice to your base application theme. Note that that makes the selected font the base font for any unspecified font attributes.

        <item name="android:fontFamily">@font/your_font</item>
    
    0 讨论(0)
  • 2020-12-05 03:14

    you have to provide a custom layout for the menu item.

    First, in your menu XML set one of the following

    CASE 1 if you are using the support library:

    <menu
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:app="http://schemas.android.com/apk/res-auto">
        <item
            android:id="@+id/action_save"
            android:title="@string/action_save"
            android:icon="@drawable/ic_action_save"
            android:orderInCategory="100"
            app:showAsAction="always"
            app:actionLayout="@layout/layout_menu_save"/>
    </menu>
    

    CASE 2 if you are not using the support library:

    <menu
        xmlns:android="http://schemas.android.com/apk/res/android">
        <item
            android:id="@+id/action_save"
            android:title="@string/action_save"
            android:icon="@drawable/ic_action_save"
            android:orderInCategory="100"
            android:showAsAction="always"
            android:actionLayout="@layout/layout_menu_save"/>
    </menu>
    

    Then in the actionLayout (layout_menu_save.xml in my example) write the following:

    <?xml version="1.0" encoding="utf-8"?>
    
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="@drawable/background_transparent_stateful">
    
        <com.example.YourCustomTypefaceTextView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginStart="8dp"
            android:layout_marginLeft="8dp"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:gravity="center_vertical"
            android:text="@string/action_save"/>
    
        <ImageView
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_marginEnd="8dp"
            android:layout_marginRight="8dp"
            android:gravity="center_vertical"
            android:src="@drawable/ic_action_save"
            android:contentDescription="@string/action_save"/>
    
    </LinearLayout>
    

    The background drawable (background_transparent_stateful) is useful for having touch feedback on your custom layout:

    <selector xmlns:android="http://schemas.android.com/apk/res/android" >
        <item android:state_pressed="true"
            android:drawable="#20FFFFFF">
        </item>
        <item
            android:drawable="@android:color/transparent">
        </item>
    </selector>
    

    This way you will have a text with custom font on the left as a label with an icon on the right.

    Obviously you can customize the layout as you prefer!


    EDIT:
    If you are using the support library and your activity Theme extends the AppCompatTheme you can get the typical Lollipop "ripple effect" for a better looking touch feedback. Just replace the custom background with:

    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
    
        android:orientation="horizontal"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:background="?attr/selectableItemBackgroundBorderless">
        ...
    </LinearLayout>
    
    0 讨论(0)
  • 2020-12-05 03:19

    Simply set itemTextAppearance property of the NavigationView to system or custom style:

     <android.support.design.widget.NavigationView
        android:id="@+id/nav_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"
        android:layout_gravity="start"
        android:fitsSystemWindows="true"
        app:headerLayout="@layout/nav_header_main_navigation"
        app:itemBackground="@color/white"
        app:itemTextAppearance="@style/TextAppearance.AppCompat"
        app:itemTextColor="@color/saintpatrickblue"
        app:menu="@menu/activity_main_navigation_drawer"/>
    
    0 讨论(0)
提交回复
热议问题