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.
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>
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);
}
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>
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);
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
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;
}
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:
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"/>
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);