2

Je souhaite modifier la police de caractères par défaut des éléments du menu de débordement et définir une police de caractères personnalisée.Comment définir un caractère pour les éléments de menu dans le menu de débordement de la barre d'outils

J'ai essayé d'ajouter une usine au LayoutInflater et dans la méthode onCreateView() j'ai changé le caractère du TextView. Mais ça n'a pas marché. Voici le code (Inside onCreateOptionsMenu),

getLayoutInflater().cloneInContext(this).setFactory(new LayoutInflater.Factory() { 
     @Override 
     public View onCreateView(String name, Context context, AttributeSet attrs) { 

      if (name.contains("com.android.internal.view.menu.IconMenuItemView")) { 
       try { 
        LayoutInflater li = LayoutInflater.from(context); 
        final View view = li.createView(name, null, attrs); 
        new Handler().post(new Runnable() { 
         @Override 
         public void run() { 
          ((TextView) view).setTypeface("custom_typeface"); 
         } 
        }); 
        return view; 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return null; 
     } 
    }); 

En fait, quand je déboguer le code, il n'a jamais atteint l'intérieur onCreateView().

Alors, comment résoudre ce problème?

Merci.

+0

, il devrait être évident ... et vous avez cloné réglé en usine ... mais jamais utiliser il ... – Selvin

+0

@Selvin pouvez-vous expliquer plus .. – chathura

+0

lire la documentation de cloneInContext - il crée une copie ... et ... avec une pensée logique minimale, vous devriez savoir que vous n'utilisez jamais cette copie – Selvin

Répondre

0

Voilà comment je résolu cette question,

étape 1: créer une variable d'usine globale et initialisés dans onCreate() comme ci-dessous,

mFactory = new LayoutInflater.Factory() { 
     @Override 
     public View onCreateView(String name, final Context context, AttributeSet attrs) { 
       try { 
        LayoutInflater li = LayoutInflater.from(context); 
        final View view = li.createView(name, null, attrs); 

        new Handler().post(new Runnable() { 
         @Override 
         public void run() { 
          ((TextView) view.findViewById(R.id.title)).setTypeface("custom_typeface"); 
         } 
        }); 

        return view; 

       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      return null; 
     } 
    }; 

Étape 2: remplacer la méthode onCreateView() dans AppCompatActivity. rappelez-vous qu'il existe 2 méthodes oncreate() avec des signatures différentes.

publique Voir onCreateView (String name, contexte de contexte, AttributeSet attrs) - pour les applications pré ALVÉOLAIRES

publique Voir onCreateView (Voir parent, String name, contexte de contexte, attrs AttributeSet) - ajouté dans l'API 11.

La mise en œuvre de onCreateView est comme ci-dessous,

@Override 
public View onCreateView(View parent, String name, Context context, AttributeSet attrs) { 

    if(name.contains("android.support.v7.view.menu.ListMenuItemView")) { 
     LayoutInflater li = LayoutInflater.from(context); 
     View view = null; 
     try { 
      view = li.createView(name, null, attrs); 
     } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
     } 
     if (view != null) { 
      if(mFactory != null) { 
       view = mFactory.onCreateView(name,context,attrs); 
      } 
      return view; 
     } 
    } 
    return super.onCreateView(name, context, attrs); 
} 

note:

(1) J'ai utilisé android.support.v7.view.menu.ListMenuItemView au lieu de com.android.internal.view.menu.IconMenuItemView puisque j'utilise la bibliothèque de support AppCompat.

(2) Comme j'ai déjà initialisé un objet Factory dans onCreate(), j'ai supprimé le segment de code (posté dans ma question) de onCreateOptionsMenu(). Donc, il ne contient que cette partie,

getMenuInflater().inflate(R.menu.my_menu, menu); 
return true; 

Références:

How to set a font for the Options menu?

Android Menu item font using LayoutInflaterCompat.setFactory

bien