动态更改工具栏MenuItem文本

时间:2016-05-13 08:08:00

标签: android android-support-library android-toolbar

在应用程序中,我正在处理各种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”(即代码正在运行,并影响菜单项),但颜色不会改变。

有没有办法动态影响此工具栏操作项文本的颜色?

2 个答案:

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

原始答案

您的跨度示例按预期工作。见结果:

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

我希望这会有所帮助。如果有任何问题,请告诉我。

答案 1 :(得分:0)

试试这个:

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