Ändern Sie MenuItem Textfarbe programmgesteuert

Also habe ich ein Menüpunkt, das ist definiert als:

<item android:id="@+id/action_live" android:title="@string/action_live" android:orderInCategory="1" app:showAsAction="ifRoom|withText" /> 

Es zeigt sich als Text, wie Sie unten sehen können:

  • Plugin ist zu alt, bitte aktualisieren Sie auf eine neuere Version, oder setzen Sie ANDROID_DAILY_OVERRIDE Umgebungsvariable auf
  • WindowManager $ BadTokenException kann kein Fenster hinzufügen
  • ORMLite setzt alle Tabellen zurück
  • Android selbst signiertes Zertifikat: Vertrauensanker für Zertifizierungspfad nicht gefunden
  • Wieder: Android MQTT kann Client nicht erstellen
  • Verweise auf einen separaten Android-Präferenzbildschirm aus einem anderen Präferenzbildschirm in XML
  • Screenshot 1

    Und ich möchte programmgesteuert die "LIVE" Textfarbe ändern. Ich habe eine Weile gesucht und ich habe eine Methode gefunden:

    Mit global definierten:

     private Menu mOptionsMenu; 

    und:

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

    Ich mache:

     MenuItem liveitem = mOptionsMenu.findItem(R.id.action_live); SpannableString s = new SpannableString(liveitem.getTitle().toString()); s.setSpan(new ForegroundColorSpan(Color.RED), 0, s.length(), 0); liveitem.setTitle(s); 

    Aber nichts passiert!

    Wenn ich das gleiche für ein Element des Überlauf-Menüs mache, funktioniert es:

    Screenshot 2

    Gibt es eine gewisse Einschränkung für app: showAsAction = "ifRoom | withText" Artikel? Gibt es irgendeinen Workaround?

    Danke im Voraus.

  • Kann ich jetzt Java 8 mit Android Development nutzen?
  • Einstellung Holo Thema für Android-Anwendung
  • Warum kann ich erfolgreich eine Datei in Linux verschieben, während es geschrieben wird?
  • Ergebnis aus einer Aktivität nach beenden () erhalten; In einem Android-Unit-Test
  • Android - Probleme mit der Protokollierung der Start-Latenz
  • Ellipse nur einen Abschnitt in einem TextView
  • 4 Solutions collect form web for “Ändern Sie MenuItem Textfarbe programmgesteuert”

    Biss spät an die Party mit diesem, aber ich verbrachte eine Weile daran zu arbeiten und fand eine Lösung, die von Nutzen für jedermann sein kann, der versucht, dasselbe zu tun. Manche Gutschriften gehen an Harish Sridharan, um mich in die richtige Richtung zu lenken.

    Sie können findViewById(R.id.MY_MENU_ITEM_ID) , um den Menüpunkt zu finden (vorausgesetzt, dass das Menü erstellt und vorbereitet wurde) und werfen Sie es auf eine TextView Instanz, wie von Harish vorgeschlagen, die dann nach Bedarf gestylt werden kann.

     public class MyAwesomeActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { getWindow().requestFeature(Window.FEATURE_ACTION_BAR); super.onCreate(savedInstanceState); // Force invalidatation of the menu to cause onPrepareOptionMenu to be called invalidateOptionsMenu(); } private void styleMenuButton() { // Find the menu item you want to style View view = findViewById(R.id.YOUR_MENU_ITEM_ID_HERE); // Cast to a TextView instance if the menu item was found if (view != null && view instanceof TextView) { ((TextView) view).setTextColor( Color.BLUE ); // Make text colour blue ((TextView) view).setTextSize(TypedValue.COMPLEX_UNIT_SP, 24); // Increase font size } } @Override public boolean onPrepareOptionsMenu(Menu menu) { boolean result = super.onPrepareOptionsMenu(menu); styleMenuButton(); return result; } 

    }

    Der Trick hier ist, das Menü zu erzwingen, um in der Aktivität onCreate Ereignis ungültig onPrepareMenuOptions zu werden (wodurch die onPrepareMenuOptions früher aufgerufen werden, als es normalerweise war). Innerhalb dieser Methode können wir den Menüpunkt und den Stil nach Bedarf finden.

    Es wird nur eine Textansicht nach der Inspektion, seine echte Klasse ist ActionMenuItemView, auf der wir die Textfarbe so weiter setzen können:

     public static void setToolbarMenuItemTextColor(final Toolbar toolbar, final @ColorRes int color, @IdRes final int resId) { if (toolbar != null) { for (int i = 0; i < toolbar.getChildCount(); i++) { final View view = toolbar.getChildAt(i); if (view instanceof ActionMenuView) { final ActionMenuView actionMenuView = (ActionMenuView) view; // view children are accessible only after layout-ing actionMenuView.post(new Runnable() { @Override public void run() { for (int j = 0; j < actionMenuView.getChildCount(); j++) { final View innerView = actionMenuView.getChildAt(j); if (innerView instanceof ActionMenuItemView) { final ActionMenuItemView itemView = (ActionMenuItemView) innerView; if (resId == itemView.getId()) { itemView.setTextColor(ContextCompat.getColor(toolbar.getContext(), color)); } } } } }); } } } } 

    @RRP gib mir einen Hinweis, aber seine Lösung funktioniert nicht für mich. Und @Box geben ein anderes, aber seine Antwort sieht ein wenig nicht so sauberer aus. Danke ihnen. Also nach ihnen habe ich eine Gesamtlösung.

     private static void setMenuTextColor(final Context context, final Toolbar toolbar, final int menuResId, final int colorRes) { toolbar.post(new Runnable() { @Override public void run() { View settingsMenuItem = toolbar.findViewById(menuResId); if (settingsMenuItem instanceof TextView) { if (DEBUG) { Log.i(TAG, "setMenuTextColor textview"); } TextView tv = (TextView) settingsMenuItem; tv.setTextColor(ContextCompat.getColor(context, colorRes)); } else { // you can ignore this branch, because usually there is not the situation Menu menu = toolbar.getMenu(); MenuItem item = menu.findItem(menuResId); SpannableString s = new SpannableString(item.getTitle()); s.setSpan(new ForegroundColorSpan(ContextCompat.getColor(context, colorRes)), 0, s.length(), 0); item.setTitle(s); } } }); } 

    MenuItem, wie von der Dokumentation definiert, ist eine Schnittstelle. Es wird definitiv mit einem View-Widget implementiert, bevor es als Menü dargestellt wird. Die meisten Fälle sind diese Menüpunkte als TextView implementiert. Sie können UiAutomatorViewer verwenden, um die Ansichtshierarchie zu sehen oder sogar hierarchyviewer zu verwenden, die in [sdk-home] / tools / gefunden werden. Angefügt eine Probe uiautomatorviewer screenshot für ein MenuItem

    So können Sie immer Ihr MenuItem schreiben und die Farbe einstellen.

     TextView liveitem = (TextView)mOptionsMenu.findItem(R.id.action_live); liveitem.setTextColor(Color.RED); 

    BEARBEITEN:

    Da gab es eine Anforderung zu sehen, wie man dieses Tool benutzt, füge ich noch ein paar Inhalte hinzu.

    Stellen Sie sicher, dass Sie die Umgebungsvariable $ ANDROID_HOME auf Ihr SDK HOME gesetzt haben.

    In deinem Terminal:

     cd $ANDROID_HOME ./tools/uiautomatorviewer 

    Dieses Tool wird geöffnet.

    Die zweite oder dritte Schaltfläche (siehe Screenshot) im Menü wird den Screenshot Ihres angeschlossenen Gerätes oder Emulators erfassen und Sie können die Ansicht und ihre Hierarchie überprüfen. Wenn Sie auf die Ansicht klicken, wird die Ansicht und ihre Informationen beschrieben. Es ist Werkzeug, das absichtlich für die Prüfung konzipiert ist und Sie können jede Anwendung zu überprüfen.

    Siehe Entwickler-Website für weitere Informationen: uiautomatorviewer

    Uiautomatorviewer

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.