2016-05-13 129 views
1

在應用程序中,我正在處理來自HTTP響應的各種UI元素的顏色,即着色在運行時完成,無法使用Android主題完成。動態更改工具欄的文本顏色MenuItem文本

有關此主題的其他問題,但大多數都使用主題,或者如果動態代碼,代碼不起作用。例如,使用跨度:

@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

我使用的是支持庫,不能投的菜單項來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(模擬),棒棒糖和Marshamallow上測試過它。我的活動也從AppCompatActivity繼承。顯然我錯過了一些東西,但我不知道是什麼。 –