在应用程序中,我正在处理各种UI元素的颜色来自HTTP响应,即着色是在运行时完成的,并且无法使用Android主题完成。
关于此主题存在其他问题,但大多数都使用主题,或者如果是动态代码,则代码无效。例如,使用跨度:
@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字符串的类似方法。
上面的代码在理论上应用了带着色的span,但是虽然标题附加了“XX”(即代码正在运行,并影响菜单项),但颜色不会改变。
有没有办法动态影响此工具栏操作项文本的颜色?
答案 0 :(得分: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);
}
}
您的跨度示例按预期工作。见结果:
此示例中使用的代码:
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);
}
}
我希望这会有所帮助。如果有任何问题,请告诉我。
答案 1 :(得分:0)
试试这个:
TextView liveitem = (TextView )mOptionsMenu.findItem(R.id.action_live);
liveitem.setTextColor(Color.RED);