2016-09-05 4 views
0

Можно ли получить TextView за заголовок MenuItem за NavigationView? (Я хочу, чтобы изменить шрифт)Android Support Library - получить название TextView from 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> 

И мой макет:

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

Я видел какой-то другой пример, где отливку MenuItem к TextView должен работать, но в моем case он просто возвращает null.

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

Как получить доступ к названию, чтобы я мог манипулировать шрифтом?

Подробнее Справочная информация:

Я обычно установки шрифта с помощью DataBindings, но для компонентов библиотеки Поддержка Android это не работает, так что я должен получить доступ к TextView вручную и установить его так:

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

Вам не нужно, чтобы установить шрифт программно или получить «TextView». Вы можете создавать и настраивать практически все аспекты «NavigationView». В вашем случае все, что вам нужно сделать, это присвоить стиль атрибуту 'itemTextAppearance'. –

+0

К сожалению, это невозможно, так как я использую привязки данных для установки шрифтов и не хочу использовать что-то вроде каллиграфии. См. Это: https://github.com/lisawray/fontbinding – nilsi

ответ

0

Наконец-то я нашел способ сделать это. Это не очень красиво, но это работает.

Pass MenuItems к методу:

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

Метод выглядит следующим образом:

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, который расширяет TypefaceSpan:

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); 
    } 
} 
Смежные вопросы