2016-05-13 3 views
1

В приложении я работаю над цветами для различных элементов пользовательского интерфейса, исходящими из HTTP-ответа, т. Е. Окраска выполняется с времени выполнения и не может быть выполнена с использованием Android-тематики.Динамическое изменение цвета текста панели инструментов MenuItem text

Другие вопросы существуют по этой теме, но большинство из них использует темы, или если динамический код, код не работает. Например, с использованием пролетов:

@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; 
} 

Или аналогичные подходы, применяющие HTML-строки.

В приведенном выше кодексе применяется диапазон с раскраской, но хотя заголовок имеет «XX» (т.е. код работает и влияет на элемент меню), цвет не изменяется.

Есть ли способ динамически влиять на цвет текста элемента действия панели инструментов?

+0

Просьба уточнить, в какой момент вы устанавливаете новый цвет –

+0

у меня есть гибкость, но в настоящее время я пытаюсь сделать это в onPrepareOptionsMenu() –

ответ

0

Попробуйте это:

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

я использую библиотеку поддержки, и не может бросить MenuItem в TextView (или AppCompatTextView), по крайней мере, в onPrepareOptionsMenu(): java.lang.ClassCastException: android.support.v7.view.menu.MenuItemImpl не может быть добавлен в файл android.widget.TextView. Или, возможно, актер может работать в другой точке жизненного цикла Activity? –

1

Обновлено

Также он работает, как ожидается, в случае, если вы используете 'Панель инструментов' непосредственно. См пример

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); 
    } 
} 

оригинальный ответ

Ваш пролеты пример работает, как ожидалось. Смотри результаты:

enter image description here

enter image description here

Вот код, используемый для этого образца:

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); 
    } 
} 

Я надеюсь, что это будет полезно. Пожалуйста, дайте мне знать, если есть какие-либо вопросы.

+0

Я тщательно сравнивал свой код с вашим по строкам, и, насколько я вижу, они идентичны. Я расширил образец кода в моем исходном вопросе, вставив его из моего источника. Я пробовал много вариантов кода и еще не видел, чтобы он работал. Я протестировал его на N (эмулированный), Lollipop и Marshamallow. Моя активность также наследуется от AppCompatActivity. Ясно, что я что-то упускаю, но понятия не имею, что. –

Смежные вопросы