web-dev-qa-db-de.com

Wie kann ich die benutzerdefinierte Schriftart des Android-Menüelements ändern?

Ich habe den folgenden Java- und XML-Code für Android. Ich möchte die Schriftart der Menüelemente meiner App ändern. Ich weiß nur, dass wir die Schriftart von TextView mit setTypeface ändern können, aber trotzdem nicht in der Lage sind, das Menüelement zu finden.

Java-Code-:

@Override
public boolean onCreateOptionsMenu(Menu menu) {    
    MenuInflater inflater = getMenuInflater();
    inflater.inflate(R.menu.main, menu);
    return true;
}

@Override    
public boolean onOptionsItemSelected(MenuItem item) {
   switch (item.getItemId()) {     
        case R.id.action_refresh1:                                          
            Toast.makeText(this, "Item1 Selected", Toast.LENGTH_SHORT)
            .show();      
        break;

        case R.id.action_refresh2:                                          
            Toast.makeText(this, "Item2 Selected", Toast.LENGTH_SHORT)
            .show();      
            break;

        default:      
            break;
   }
}

XML-Code-:  

<menu xmlns:Android="http://schemas.Android.com/apk/res/Android" >
<item
    Android:id="@+id/action_refresh1"
    Android:orderInCategory="100"
    Android:showAsAction="always"
    Android:title="Item1"/>

<item
    Android:id="@+id/action_refresh2"
    Android:orderInCategory="100"
    Android:showAsAction="always"
    Android:title="Item2"/>
</menu>

Ich möchte die Schriftart von zwei Menüelementen ändern, weiß jedoch nicht, wie das settypface für das Menüelement integriert wird.

17
animation123

sie müssen ein benutzerdefiniertes Layout für den Menüpunkt bereitstellen.

Legen Sie zunächst in Ihrem Menü XML Folgendes fest

CASE 1 Wenn Sie die Support-Bibliothek verwenden:

<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 Wenn Sie nicht die Unterstützungsbibliothek verwenden:

<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>

Dann schreiben Sie im actionLayout (in meinem Beispiel layout_menu_save.xml) Folgendes:

<?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>

Der Hintergrund, der gezeichnet werden kann (background_transparent_stateful), ist hilfreich, um Feedback zu Ihrem benutzerdefinierten Layout zu erhalten:

<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>

Auf diese Weise haben Sie links einen Text mit benutzerdefinierter Schriftart als Beschriftung und rechts ein Symbol.

Natürlich können Sie das Layout nach Ihren Wünschen anpassen!


EDIT:
Wenn Sie die Unterstützungsbibliothek verwenden und Ihr Theme um AppCompatTheme erweitert wird, können Sie den typischen Lollipop " Ripple-Effekt " für ein besseres Feedback erhalten.

<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>
18
araks

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 AKTIVITÄT 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);
    }
8
NickUnuchek

Fügen Sie einfach die Schriftart Ihrer Wahl zu Ihrem Basisanwendungsthema hinzu. Beachten Sie, dass die ausgewählte Schriftart die Basisschriftart für alle nicht angegebenen Schriftattribute ist.

    <item name="Android:fontFamily">@font/your_font</item>
7
Simo Nyathi

Sie können auch eine SpannableStringBuilder verwenden, wenn Sie ein Menüelement mit einer TypefaceSpan hinzufügen. Machen Sie für jeden Menüpunkt etwas

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);
3
Stephen Johnson

Erstellen Sie einen Style in styles.xml

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

Fügen Sie den folgenden Code in Android.support.design.widget.NavigationView hinzu 

 app:itemTextAppearance="@style/Style_TextView"

Hinweis: Es funktioniert für Android.support.design.widget.NavigationView

2
Suman

Ich fand diese Lösung für mich nützlich. Hoffentlich hilft sie neuen Surfern.

ihr Menü 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>

Nachdem Sie das benutzerdefinierte Menü aufgeblasen haben, können Sie auf den Menüpunkt verweisen. Wenn Sie den Verweis auf das Menüelement erhalten, können Sie das Element anpassen, um das Symbol und den Unicode-Text anzuzeigen. Ihre Icon-Image-Datei muss im gespeichert werden 

res/drawable Ordner.

@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;

   }
1

Wenn Ihre App nur funktionieren muss Android [~ # ~] p [~ # ~] ie (API Level 28) und höher können Sie ein TypefaceSpan aus einem Schrift in onPrepareOptionsMen. Ansonsten Sie kann eine CustomTypefaceSpan Klasse wie diese verwenden answer = schlägt vor:

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>

Vorher & Nachher: ​​

Before & After

1
shash678

Setzen Sie einfach die itemTextAppearance -Eigenschaft von NavigationView auf System- oder benutzerdefinierten Stil:

 <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
christian mini

Die Antwort von @brahmyadigopula funktioniert gut.

Hier ist nur eine vollständigere Version zur Vereinfachung:

Das Menü

<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 deiner Aktivität oder im 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
Joolah