2016-09-05 2 views
0

Ist es möglich, eine TextView für den Titel einer MenuItem für eine NavigationView zu bekommen? (Ich möchte die Schriftart ändern)Android-Support-Bibliothek - get Titel TextView von NavigationView

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

    <group android:checkableBehavior="single"> 

     <item 
     android:id="@+id/cards" 
     android:icon="@drawable/ic_menu_cards" 
     android:clickable="false" 
     android:title="Cards" 
     app:showAsAction="always"/> 

     <item 
     android:id="@+id/waiter" 
     android:icon="@drawable/ic_menu_waiter" 
     android:clickable="false" 
     android:title="Timer Mode" 
     app:showAsAction="always"/> 

     <item 
     android:id="@+id/settings" 
     android:icon="@drawable/ic_menu_settings" 
     android:title="Settings" 
     app:showAsAction="always"/> 


     <item 
     android:id="@+id/purchase" 
     android:icon="@drawable/ic_menu_purchase" 
     android:clickable="false" 
     android:title="Purchase" 
     app:showAsAction="always"/> 

     <item 
     android:id="@+id/feedback" 
     android:icon="@drawable/ic_menu_feedback" 
     android:clickable="false" 
     android:title="Feedback" 
     app:showAsAction="always"/> 
    </group> 
</menu> 

Und mein Layout:

<android.support.v4.widget.DrawerLayout 
    android:id="@+id/drawer" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:fitsSystemWindows="true"> 

    <LinearLayout 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:orientation="vertical" > 

     <!-- Removed for simplicity --> 

    </LinearLayout> 

    <android.support.design.widget.NavigationView 
     android:id="@+id/navigation_view" 
     android:layout_height="match_parent" 
     android:layout_width="wrap_content" 
     android:layout_gravity="start" 
     android:theme="@style/NavigationDrawer" 
     app:headerLayout="@layout/navigation_view_header" 
     app:itemTextColor="@color/white" 
     app:menu="@menu/drawer_menu" /> 

</android.support.v4.widget.DrawerLayout> 

ich ein anderes Beispiel gesehen haben, wo die MenuItem zu TextView Gießen sollte funktionieren, aber in meiner Fall, es gibt nur null zurück.

TextView title = (TextView) navigationView.getMenu().getItem(0) <-- TextView becomes null 

Wie kann ich den Titel zugreifen, damit ich die Schrift manipulieren?

Weitere Hintergrundinfo:

ich normalerweise bin Einstellung der Schriftart Databindings verwenden, aber für Android Support Library Komponenten dies nicht funktioniert, so muss ich manuell den Textview zugreifen und es wie folgt festgelegt:

textView.setTypeface(FontCache.getInstance(textView.getContext()).get("lato_regular")); 
+0

Sie brauchen nicht die festlegen Schriftart programmgesteuert oder erhalten Sie die 'TextView'. Sie können fast jeden Aspekt der 'NavigationView' gestalten und anpassen. In Ihrem Fall müssen Sie dem Attribut "itemTextAppearance" lediglich einen Stil zuweisen. –

+0

Leider ist es nicht möglich, da ich Datenbindungen für die Einstellung der Schriftarten verwende und keine Lust auf etwas wie Kalligraphie habe. Siehe hierzu: https://github.com/lisawray/fontbinding – nilsi

Antwort

0

Ich habe endlich einen Weg gefunden, es zu tun. Es ist nicht sehr hübsch, aber es funktioniert.

Pass MenuItems ein Verfahren:

setMenuItemFont(binding.navigationView.getMenu().getItem(0)); 

Methode sieht wie folgt aus:

private void setMenuItemFont(MenuItem menuItem) { 
    SpannableString span = new SpannableString(menuItem.getTitle()); 
    span.setSpan(new CustomTypefaceSpan(FontCache.getInstance(getApplicationContext()).get("lato_regular")), 0 , span.length(), Spannable.SPAN_INCLUSIVE_INCLUSIVE); 
    menuItem.setTitle(span); 
} 

Helper-Klasse, die eine TypefaceSpan erweitert:

package android.app.app; 

import android.graphics.Typeface; 
import android.text.TextPaint; 
import android.text.style.TypefaceSpan; 

public class CustomTypefaceSpan extends TypefaceSpan { 

    private final Typeface newType; 

    public CustomTypefaceSpan(Typeface type) { 
     super(""); 
     newType = type; 
    } 

    @Override 
    public void updateDrawState(TextPaint ds) { 
     ds.setTypeface(newType); 
    } 

    @Override 
    public void updateMeasureState(TextPaint paint) { 
     paint.setTypeface(newType); 
    } 
} 
Verwandte Themen