2016-05-13 6 views
1

In der App arbeite ich an Farben für verschiedene UI-Elemente kommen von einer HTTP-Antwort, dh Färbung ist bei Laufzeit getan, und kann nicht mit Android theming getan werden.Dynamische Änderung der Textfarbe von Toolbar MenuItem Text

Zu diesem Thema gibt es noch weitere Fragen, aber die meisten verwenden Themes oder, wenn dynamischer Code, funktioniert der Code nicht. Zum Beispiel unter Verwendung von Spannen:

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

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    menuItemGoalSave = menu.findItem(R.id.action_goal_edit_save); 
    SpannableString s = new SpannableString(menuItemGoalSave.getTitle() + "XX"); 
    ForegroundColorSpan span = new ForegroundColorSpan(Color.RED); 
    s.setSpan(span, 0, s.length(), 0); 
    menuItemGoalSave.setTitle(s); 
    return true; 
} 

Oder ähnliche Ansätze HTML-Strings anwenden.

Der obige Code wendet theoretisch einen Farbbereich an, aber obwohl der Titel "XX" angehängt hat (dh der Code läuft und den Menüeintrag beeinflusst), ändert sich die Farbe nicht.

Gibt es eine Möglichkeit, die Farbe dieses Symbolleistenaktionselementtexts dynamisch zu beeinflussen?

+0

Bitte zu klären, zu welchem ​​Zeitpunkt Sie setzen neue Farbe –

+0

I Flexibilität habe, aber zur Zeit sind versucht, es in onPrepareOptionsMenu() zu tun –

Antwort

0

Versuchen Sie folgendes:

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

ich die Unterstützung Bibliothek verwenden, und kann die MenuItem Textview (oder AppCompatTextView) nicht werfen, Zumindest in onPrepareOptionsMenu(): java.lang.ClassCastException: android.support.v7.view.menu.MenuItemImpl kann nicht in android.widget.TextView umgewandelt werden. Oder funktioniert der Cast möglicherweise an einem anderen Punkt im Activity-Lebenszyklus? –

1

Aktualisiert

Auch funktioniert es wie im Fall erwartet, wenn Sie direkt 'Toolbar' verwenden. Siehe Beispiel

public class MainActivity extends AppCompatActivity implements Toolbar.OnMenuItemClickListener { 

    private Toolbar mToolbar; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     mToolbar = (Toolbar) findViewById(R.id.toolbar); 
     mToolbar.inflateMenu(R.menu.menu_main); 
     mToolbar.setOnMenuItemClickListener(this); 
    } 

    private void applyMenuItemTextColor() { 
     MenuItem item = mToolbar.getMenu().findItem(R.id.action_settings); 
     SpannableString s = new SpannableString(item.getTitle()); 
     ForegroundColorSpan span = new ForegroundColorSpan(System.currentTimeMillis() % 2 == 0 ? Color.RED :Color.GREEN); 
     s.setSpan(span, 0, s.length(), 0); 
     item.setTitle(s); 
    } 

    @Override 
    public boolean onMenuItemClick(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      applyMenuItemTextColor();//supportInvalidateOptionsMenu(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

Ursprüngliche Antwort

Ihre Spannweiten Beispiel wie erwartet funktioniert. Siehe Ergebnisse:

enter image description here

enter image description here

Hier Code für dieses Beispiel verwendet:

public class MainActivity extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 
    } 

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

    @Override 
    public boolean onPrepareOptionsMenu(Menu menu) { 
     MenuItem item = menu.findItem(R.id.action_settings); 
     SpannableString s = new SpannableString(item.getTitle()); 
     ForegroundColorSpan span = new ForegroundColorSpan(System.currentTimeMillis() % 2 == 0 ? Color.RED :Color.GREEN); 
     s.setSpan(span, 0, s.length(), 0); 
     item.setTitle(s); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     int id = item.getItemId(); 
     if (id == R.id.action_settings) { 
      supportInvalidateOptionsMenu(); 
      return true; 
     } 
     return super.onOptionsItemSelected(item); 
    } 
} 

Ich hoffe, das wird hilfreich sein. Bitte lassen Sie mich wissen, wenn Sie irgendwelche Fragen haben.

+0

Ich habe meinen Code Zeile für Zeile sorgfältig mit Ihrem Code verglichen, und soweit ich sehen kann, sind sie identisch. Ich habe das Codebeispiel in meiner ursprünglichen Frage erweitert und es aus meiner Quelle eingefügt. Ich habe viele Varianten des Codes ausprobiert und muss noch sehen, dass es funktioniert. Ich habe es auf N (emuliert), Lollipop und Marshamallow getestet. Meine Aktivität erbt auch von AppCompatActivity. Klar, ich vermisse etwas, aber ich habe keine Ahnung was. –

Verwandte Themen