ActionBar custom title as ImaveView instead of TextView - android

I've trying to work around this on the actionbar but from What I can see the title is basicly a TextView but I need to place an image instead of plain text. I try to set it up into the Style themes.xml as this:
<item name="android:actionBarStyle">#style/MyActionBar</item>
And then I defined this style
<style name="MyActionBar" parent="#android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#drawable/action_background</item>
<item name="android:titleTextStyle">#style/ActionbarTitleStyle</item>
</style>
I thought that I could defined the background for the title but even If I do is not what I want, try the getActionBar().setCustomView(layout); but happend that my actionbar is null before the setContentView is being called and I need it in a Base class.
PD. I only need to care about HONEYCOMB and Higher, so if you please not suggest Sherlock or Jonhanilson implementations.

if you want an image, you can specify the app logo along with the icon (it will be used instead of icon):
<application
android:icon="#drawable/ic_launcher"
android:logo="#drawable/logo"
android:label="#string/app_name"
android:name=".AppName"
>
Now you have an arbitrary image instead of your lanucher icon. What you need to do next is to get rid of the text. In your styles do something like:
<style name="Widget.Styled.ActionBar" parent="Widget.Sherlock.ActionBar">
<item name="titleTextStyle">#style/NoTitleText</item>
<item name="android:titleTextStyle">#style/NoTitleText</item>
<item name="subtitleTextStyle">#style/NoTitleText</item>
<item name="android:subtitleTextStyle">#style/NoTitleText</item>
</style>
<style name="NoTitleText">
<item name="android:textSize">0sp</item>
<item name="android:textColor">#00000000</item>
</style>
You should use both item name="titleTextStyle" and item name="android:titleTextStyle" if you use ActionBarSherlock if I remember well.

Override setContentView like this:
#Override
public void setContentView(int resLayoutId) {
super.setContentView(resLayoutId);
// TODO Set your actionbar changes here
}
OR, you can do this:
<style name="MyActionBar" parent="#android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#drawable/action_background</item>
<item name="android:titleTextStyle">#style/ActionbarTitleStyle</item>
<item name="android:displayOptions">showCustom</item>
<item name="android:customNavigationLayout">#layout/custom_nav_layout</item>
</style>

Related

Styling my app with custom colors

I'm trying to apply some styles to my app. I've created a custom theme for the ActionBar using this actionbarstylegenerator.
But I want to change also in my app, the stock blue Holo color, to a red one, at least on buttons.
So, I have the custom theme for the ActionBar (Compat), and for the other side, a custom theme to change the Holo color.
In my app, I have defined the custom theme for the Actionbar, and I want to set the custom Holo theme inside the Actionbar's theme, but I don't know how to call, or where can I find the item name's whose define the variable you want to modify.
This is, I need to set this:
<style name="ColorTheme" parent="android:Theme.Black">
<item name="android:checkboxStyle">#style/CheckBoxColorTheme</item>
<item name="android:buttonStyle">#style/ButtonColorTheme</item>
<item name="android:imageButtonStyle">#style/ImageButtonColorTheme</item>
</style>
Inside of this:
<style name="Theme.CustomActionBarTheme" parent="#style/Theme.AppCompat">
<item name="actionBarItemBackground">#drawable/ab_selectable_background</item>
<item name="popupMenuStyle">#style/PopupMenu</item>
<item name="dropDownListViewStyle">#style/DropDownListView</item>
<item name="actionBarTabStyle">#style/ActionBarTabStyle</item>
<item name="actionDropDownStyle">#style/DropDownNav</item>
<item name="actionBarStyle">#style/ActionBar.Transparent</item>
<item name="actionModeBackground">#drawable/cab_background_top_customactionbartheme</item>
<item name="actionModeSplitBackground">#drawable/cab_background_bottom_customactionbartheme</item>
<item name="actionModeCloseButtonStyle">#style/ActionButton.CloseMode</item>
</style>
Maybe you need to do this?
<style name="ColorTheme" parent="Theme.CustomActionBarTheme">
<item name="android:checkboxStyle">#style/CheckBoxColorTheme</item>
<item name="android:buttonStyle">#style/ButtonColorTheme</item>
<item name="android:imageButtonStyle">#style/ImageButtonColorTheme</item>

can't change color of actionBar divider

I tried change color of my actionBar divider , but nothing work. I' using android support library v7 for support old devices and custom style, and i also change all action bar drawable, but nothing happend!
<resources>
<style name="MyTheme" parent="Theme.AppCompat">
<item name="actionBarStyle">#style/MyActionBar</item>
</style>
<style name="MyActionBar" parent = "Widget.AppCompat.ActionBar">
<item name="background">#drawable/my_action_bar</item>
</style>
</resources>
And my ide show me strange error in layout , why did i get this error? it's not color value
java.lang.NumberFormatException: Color value '#drawable/abs__ab_transparent_dark_holo' must start with #
Solution: Need to add android namespace if use for api level >= 14 .May be it will be helpful to someone.
It is because the "divider" is an image. It's hardcoded in the Holo theme assets.
Look at platforms/android-19/data/res/drawable-xxhdpi/ab_transparent_dark_holo.9.png
The style is declared here for holo dark.
<style name="Widget.Holo.ActionBar" parent="Widget.ActionBar">
...
<item name="android:background">#android:drawable/ab_transparent_dark_holo</item>
...
</style>
It's a background. You will need to change the color in the image and replace the background of your bar.
It also needs different sizes for different resolutions.
Maybe you should set color directly, change your theme as
<item name="android:divider">#color/dividercolor</item>
Then you should add color dividercolor in you /value/color file,like
<item name="dividercolor"> #0099CC </item>
I hope this will be helpful to you
<style name="CustomTheme" parent="#android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">#style/MyTheme.ActionBarStyle</item>
<item name="android:actionBarDivider">#drawable/action_vertical_doted</item>
<item name="android:actionButtonStyle">#style/MyTheme.ActionBar.ActionButton</item>
<item name="android:actionMenuTextColor">#ffffff</item>
<!-- <item name="android:actionMenuTextAppearance">#style/MyTheme.Menu.FontStyle</item> -->
<!-- <item name="android:actionBarSize">50dp</item> -->
</style>
<style name="MyTheme.ActionBarStyle" parent="#android:style/Widget.Holo.Light.ActionBar">
<item name="android:titleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
<item name="android:background">#drawable/actionbar_bg_shap</item>
<item name="android:displayOptions">none</item>
<item name="android:backgroundSplit">#drawable/actionbar_bg_shap</item>
</style>
<style name="MyTheme.ActionBar.ActionButton" parent="#android:style/Widget.Holo.Light.ActionButton">
<item name="android:background">#drawable/main_button_inactive_tr</item>
</style>

Actionbar Sherlock title shows for a sec at first run

As i mentioned in title of question I want to completely remove title from actionbar but at first run (when I run it from eclipse) title shows for a while and it's not what I want
in the onCreate method I've add this 2 line of code and its work but LATE!!
getSupportActionBar().setTitle("");
getSupportActionBar().setDisplayShowTitleEnabled(false);
may this 2 pics help u understand me
Set your theme to 'no action bar' in your manifest, then apply your normal theme in code after set contentview!
android:theme="#style/Theme.Sherlock.Light.NoActionBar"
and then.
this.setTheme(R.style.myTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
While your code hides actionBar Title, the title will still be displayed while your activity is loading and before you remove the title in your code.
I think a better solution if you want to remove title from actionbar in all of your activities from the start is to do it by setting a theme and override the actionbar style.
To do this you have to create a style in your styles.xml and use this as your application theme e.g.
<style name="AppTheme" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="android:actionBarStyle">#style/AppTheme.ActionBarStyle</item
<item name="actionBarStyle">#style/AppTheme.ActionBarStyle</item>
</style>
<style name="AppTheme.ActionBarStyle" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="android:titleTextStyle">#style/AppTheme.ActionBarStyle.TitleTextStyle</item>
<item name="titleTextStyle">#style/AppTheme.ActionBarStyle.TitleTextStyle</item>
</style>
<style name="AppTheme.ActionBarStyle.TitleTextStyle" parent="TextAppearance.Sherlock.Widget.ActionBar.Title">
<item name="android:textSize">0dp</item>
<item name="textSize">0sp</item>
<item name="android:textColor">#00000000</item>
<item name="textColor">#00000000</item>
</style>
or another example:
<style name="AppTheme" parent="Theme.Sherlock.Light.DarkActionBar">
<item name="android:actionBarStyle" tools:ignore="NewApi">#style/AppTheme.ActionBarStyle</item>
<item name="actionBarStyle">#style/AppTheme.ActionBarStyle</item>
</style>
<style name="AppTheme.ActionBarStyle" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="android:displayOptions" tools:ignore="NewApi">useLogo|showHome</item>
<item name="displayOptions">useLogo|showHome</item>
</style>
These Code samples were taken from some of my projects where i use actionbarsherlock so you may have to edit it according to your needs.
Hope it helps.

Define custom Logo for ActionBar (different than Logo) in XML?

I want to make a Actionbar_style.xml for my app and I would like to use a logo, different than my app logo / icon.
How to change it programmatcially is clear: Change logo that appears in Android ActionBar programatically
But like this I would need to code this into each activity.
Is there a xml tag to define a custom Actionbarlogo in xml already?
my Customstyles.xml
<style name="CustomActionBar0" parent="android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#drawable/action_bg0</item>
</style>
android styles.xml seems not to have it...
<style name="Widget.ActionBar">
<item name="android:background">#android:drawable/action_bar_background</item>
<item name="android:displayOptions">useLogo|showHome|showTitle</item>
<item name="android:divider">#android:drawable/action_bar_divider</item>
<item name="android:height">?android:attr/actionBarSize</item>
<item name="android:paddingLeft">0dip</item>
<item name="android:paddingTop">0dip</item>
<item name="android:paddingRight">0dip</item>
<item name="android:paddingBottom">0dip</item>
<item name="android:titleTextStyle">#android:style/TextAppearance.Widget.ActionBar.Title</item>
<item name="android:subtitleTextStyle">#android:style/TextAppearance.Widget.ActionBar.Subtitle</item>
<item name="android:progressBarStyle">#android:style/Widget.ProgressBar.Horizontal</item>
<item name="android:indeterminateProgressStyle">#android:style/Widget.ProgressBar.Small</item>
<item name="android:homeLayout">#android:layout/action_bar_home</item>
</style>
Just set a value for the android:icon attribute
<style name="AppTheme" parent="#android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">#style/AppTheme.ActionBarStyle</item>
</style>
<style name="AppTheme.ActionBarStyle" parent="android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#drawable/actionbar_background</item>
<item name="android:titleTextStyle">#style/AppTheme.ActionBar.TitleTextStyle</item>
<item name="android:icon">#drawable/ic_home</item>
<item name="android:indeterminateProgressStyle">#style/IndeterminateProgress</item>
</style>
You don't style the logo in the your style XML, you simply use android:logo in your Manifest, then use setDisplayUseLogoEnabled() to set it in the ActionBar. Here's a project, from Google, that shows you how to switch between the two. http://code.google.com/p/styled-action-bar/
Sounds like you need to use a custom layout for the action bar, that way you can define a whatever you want for logo image.
Action bar / ActionbarSherlock style
<style name="ActionBar" parent="Widget.Sherlock.Light.ActionBar.Solid.Inverse">
<item name="displayOptions">showCustom</item>
<item name="android:displayOptions">showCustom</item>
<item name="customNavigationLayout">#layout/action_bar_home_icon_default</item>
<item name="android:customNavigationLayout">#layout/action_bar_home_icon_default</item>
</style>
#layout/action_bar_home_icon_default is your custom layout, with your custom logo
Yes. You may set different logo for different activities. Here is the sample code in manifest file.
<activity
android:name="MyActivity"
***android:icon="#drawable/logo"***
android:label="#string/app_name"
android:configChanges="orientation"
android:screenOrientation="portrait" />
Hope this help. Cheers!

ActionBar text color

how can I change the text color of the ActionBar? I've inherited the Holo Light Theme, I'm able to change the background of the ActionBar but I don't find out what is the attribute to tweak to change the text color.
Ok, I'm able to change the text color with the attribute android:textColorPrimary but it also changes the text color of the dropdown menu displayed when an overflow happen on the ActionBar buttons. Any idea how to change the color of those dropdown menu / List ?
Ok, I've found a better way. I'm now able to only change the color of the title. You can also tweak the subtitle.
Here is my styles.xml:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="MyTheme" parent="#android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">#style/MyTheme.ActionBarStyle</item>
</style>
<style name="MyTheme.ActionBarStyle" parent="#android:style/Widget.Holo.Light.ActionBar">
<item name="android:titleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
</style>
<style name="MyTheme.ActionBar.TitleTextStyle" parent="#android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">#color/red</item>
</style>
</resources>
I found a way that works well with any flavor of ActionBar (Sherlock, Compat, and Native):
Just use html to set the title, and specify the text color. For example, to set the ActionBar text color to red, simply do this:
getActionBar()/* or getSupportActionBar() */.setTitle(Html.fromHtml("<font color=\"red\">" + getString(R.string.app_name) + "</font>"));
You can also use the red hex code #FF0000 instead of the word red. If you are having trouble with this, see Android Html.fromHtml(String) doesn't work for <font color='#'>text</font>.
Additionally, if you want to use a color resource, this code can be used to get the correct HEX String, and removing the alpha if needed (the font tag does not support alpha):
int orange = getResources().getColor(R.color.orange);
String htmlColor = String.format(Locale.US, "#%06X", (0xFFFFFF & Color.argb(0, Color.red(orange), Color.green(orange), Color.blue(orange))));
I was having the same problem as you, it's a Holo.Light theme but I wanted to style the ActionBar color, so I needed to change the text color as well and also both Title and Menus. So at the end I went to git hub and looked at source code until I find the damn correct style:
<?xml version="1.0" encoding="utf-8"?>
<!-- For honeycomb and up -->
<resources>
<style name="myTheme" parent="#android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">#style/myTheme.ActionBar</item>
<item name="android:actionMenuTextColor">#color/actionBarText</item>
</style>
<style name="myTheme.ActionBar" parent="#android:style/Widget.Holo.Light.ActionBar">
<item name="android:background">#drawable/actionbarbground</item>
<item name="android:titleTextStyle">#style/myTheme.ActionBar.Text</item>
</style>
<style name="myTheme.ActionBar.Text" parent="#android:style/TextAppearance">
<item name="android:textColor">#color/actionBarText</item>
</style>
</resources>
so now all you have to do is set whatever #color/actionBarText and#drawable/actionbarbground you want!
The ActionBar ID is not available directly, so you have to do little bit of hacking here.
int actionBarTitleId = Resources.getSystem().getIdentifier("action_bar_title", "id", "android");
if (actionBarTitleId > 0) {
TextView title = (TextView) findViewById(actionBarTitleId);
if (title != null) {
title.setTextColor(Color.RED);
}
}
It's an old topic but for future readers, using ToolBar makes everything very easy:
Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
toolbar.setTitle(R.string.app_name);
toolbar.setTitleTextColor(getResources().getColor(R.color.someColor));
setSupportActionBar(toolbar);
The most straight-forward way is to do this in the styles.xml.
Google's template styles.xml currently generates the following:
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
</style>
If you add one more line before the closing tag, as shown, that will change the text color to what it should be with a Dark ActionBar:
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
<item name="actionBarTheme">#style/ThemeOverlay.AppCompat.Dark.ActionBar</item>
</style>
If you want to customize the color to something else, you can either specify your own color in colors.xml or even use a built-in color from Android using the android:textColorPrimary attribute:
<style name="AppTheme" parent="Theme.AppCompat.Light">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
<item name="actionBarTheme">#style/AppTheme.AppBarOverlay</item>
</style>
<style name="AppTheme.AppBarOverlay" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:textColorPrimary">#android:color/darker_gray</item>
</style>
Note: This changes the color of the title and also the titles of any MenuItems displayed in the ActionBar.
i have done with simple one line code
actionBar.setTitle(Html.fromHtml("<font color='#ff0000'>ActionBartitle </font>"));
Add it to the root of the action bar. I had this problem.
<style name="ActionBar" parent="#style/Theme.AppCompat.Light">
<item name="actionBarStyle">#style/Widget.Styled.ActionBar</item>
<item name="actionMenuTextColor">#color/stdDarkBlueText</item>
</style>
<style name="Widget.Styled.ActionBar" parent="#style/Widget.AppCompat.Light.ActionBar">
<item name="titleTextStyle">#style/ActionBarTitleText</item>
<item name="subtitleTextStyle">#style/ActionBarSubTitleText</item>
</style>
<style name="ActionBarTitleText" parent="#style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">#color/stdDarkBlueText</item>
<item name="android:textSize">12sp</item>
</style>
<style name="ActionBarSubTitleText" parent="#style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle">
<item name="android:textColor">#color/stdDarkBlueText</item>
<item name="android:textSize">12sp</item>
</style>
actionMenuTextColor - changes text color for the action bar text, it never worked when it was part of the Widget.Styled.ActionBar, so I had to add it to the root. Other 2 attributes change title and subtitle of an action bar.
Setting a HTML string on the action bar doesn't work on the Material theme in SDK v21+
If you want to change it you should set the primary text color in your style.xml
<resources>
<!-- Base application theme. -->
<style name="AppTheme" parent="android:Theme.Material.Light">
<!-- Customize your theme here. -->
<item name="android:textColorPrimary">#color/actionbar-text-color</item>
</style>
</resources>
If you want to style the subtitle also then simply add this in your custom style.
<item name="android:subtitleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
People who are looking to get the same result for AppCompat library then this is what I used:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomActivityTheme" parent="#style/Theme.AppCompat.Light.DarkActionBar">
<item name="android:actionBarStyle">#style/MyActionBar</item>
<item name="actionBarStyle">#style/MyActionBar</item>
<!-- other activity and action bar styles here -->
</style>
<!-- style for the action bar backgrounds -->
<style name="MyActionBar" parent="Theme.AppCompat.Light.DarkActionBar">
<item name="android:background">#drawable/actionbar_background</item>
<item name="background">#drawable/actionbar_background</item>
<item name="android:titleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
<item name="android:subtitleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
<item name="titleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
<item name="subtitleTextStyle">#style/MyTheme.ActionBar.TitleTextStyle</item>
</style>
<style name="MyTheme.ActionBar.TitleTextStyle" parent="#style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">#color/color_title</item>
</style>
</resources>
A lot of answers are deprecated so I'll update the thread and show how to change text color and backgroundcolor on ActionBar (Toolbar) and in ActionBar pop up menu.
The latest approach in Android (as of May 2018) in working with Action bar (Toolbar) is to use Theme with NoActionBar and use Toolbar instead.
so here is what you need:
In Activity (which extends AppCompatActivity) declare Toolbar:
Toolbar myToolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(myToolbar);
Add Toolbar in the Activity's layout xml. Here we will set our custom (overwritten themes), note android:theme="#style/ThemeOverlay.AppTheme.ActionBar" and app:popupTheme="#style/ThemeOverlay.AppTheme.PopupMenu", they will do the trick.
<android.support.v7.widget.Toolbar
android:id="#+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:minHeight="?attr/actionBarSize"
android:theme="#style/ThemeOverlay.AppTheme.ActionBar"
app:popupTheme="#style/ThemeOverlay.AppTheme.PopupMenu"
app:layout_constraintTop_toTopOf="parent" />
In your styles.xml you will have to overwrite those two styles to set custom colors:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
<item name="actionBarTheme">#style/ThemeOverlay.AppTheme.ActionBar</item>
<item name="actionBarPopupTheme">#style/ThemeOverlay.AppTheme.PopupMenu</item>
</style>
<style name="ThemeOverlay.AppTheme.ActionBar" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:textColorPrimary">#color/action_bar_text_color</item>
<item name="android:background">#color/action_bar_bg_color</item>
</style>
<style name="ThemeOverlay.AppTheme.PopupMenu" parent="ThemeOverlay.AppCompat.Dark.ActionBar">
<item name="android:background">#color/popup_bg_color</item>
<item name="android:textColorPrimary">#color/popup_text_color</item>
</style>
That's it folks
p.s. if you ask me I would say: YES, this whole Theme thing is a hell of a mess.
Found the way to do it nicely without creating your own layout on API >= 21.
It will only colorize texts and control drawables inside the action bar.
Hope it will be useful for someone.
<!--Material design primary colors-->
<style name="AppBaseTheme" parent="Theme.AppCompat.Light">
<item name="colorPrimary">#color/primary</item>
<item name="colorPrimaryDark">#color/primary_dark</item>
<item name="colorAccent">#color/accent</item>
<item name="android:navigationBarColor">#color/primary_dark</item>
<item name="actionBarTheme">#style/AppBaseTheme.Toolbar</item>
</style>
<!--Action bar-->
<style name="AppBaseTheme.Toolbar" parent="Widget.AppCompat.ActionBar.Solid">
<item name="android:textColorPrimary">#color/action_bar_text</item>
<item name="colorControlNormal">#color/action_bar_text</item>
</style>
These functions work well
In Java
private void setActionbarTextColor(ActionBar actBar, int color) {
String title = actBar.getTitle().toString();
Spannable spannablerTitle = new SpannableString(title);
spannablerTitle.setSpan(new ForegroundColorSpan(color), 0, spannablerTitle.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
actBar.setTitle(spannablerTitle);
}
then to use it just feed it your action bar and the new color i.e.
ActionBar actionBar = getActionBar(); // Or getSupportActionBar() if using appCompat
int red = Color.RED
setActionbarTextColor(actionBar, red);
In Kotlin
You can use an extension function like this:
private fun ActionBar.setTitleColor(color: Int) {
val text = SpannableString(title ?: "")
text.setSpan(ForegroundColorSpan(color),0,text.length, Spannable.SPAN_INCLUSIVE_INCLUSIVE)
title = text
}
And then apply to your ActionBar with
actionBar?.setTitleColor(Color.RED)
This is the solution I used after checking all answers
<!-- Base application theme. -->
<style name="AppTheme" parent="#style/Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorAccent">#color/Button_color</item>
<item name="android:editTextStyle">#style/EditTextStyle</item>
<item name="android:typeface">monospace</item>
<item name="android:windowActionBar">true</item>
<item name="colorPrimary">#color/Title_Bar_Color</item>
<item name="android:actionBarStyle">#style/Widget.Styled.ActionBar</item>
<item name="actionBarStyle">#style/Widget.Styled.ActionBar</item>
</style>
<style name="EditTextStyle" parent="Widget.AppCompat.EditText"/>
<style name="Widget.Styled.ActionBar" parent="#style/Widget.AppCompat.Light.ActionBar">
<item name="titleTextStyle">#style/ActionBarTitleText</item>
<item name="android:background">#color/Title_Bar_Color</item>
<item name="background">#color/Title_Bar_Color</item>
<item name="subtitleTextStyle">#style/ActionBarSubTitleText</item>
</style>
<style name="ActionBarTitleText" parent="#style/TextAppearance.AppCompat.Widget.ActionBar.Title">
<item name="android:textColor">#color/solid_white</item>
<item name="android:textSize">12sp</item>
</style>
<style name="ActionBarSubTitleText" parent="#style/TextAppearance.AppCompat.Widget.ActionBar.Subtitle">
<item name="android:textColor">#color/solid_white</item>
<item name="android:textSize">12sp</item>
</style>
Change the required colors it will work
Try adding this in your Activity's onCreate. Works on almost every Android version.
actionBar.setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));
or
getSupportActionBar().setTitle(Html.fromHtml("<font color='#ffff00'>Your Title</font>"));
just put this in your thme style.
<item name="android:textColorPrimary">#color/yourcolor</item>
Try a lot of methods, in the low version of the API,a feasible method is <item name="actionMenuTextColor">#color/your_color</item> and don't use the Android namespace,hope can help you
ps:
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
<item name="actionMenuTextColor">#color/actionMenuTextColor</item>
</style>
The most simple way is :
Add these two lines to your styles.xml file
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
...
<item name="android:textColorSecondary">#color/white</item>
<item name="android:textColor">#color/white</item>
</style>
Replace the color with your color.
Here Style.xml is like
<resources>
<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">#color/colorPrimary</item>
<item name="colorPrimaryDark">#color/colorPrimaryDark</item>
<item name="colorAccent">#color/colorAccent</item>
<item name="actionBarTheme">#style/MyTheme</item>
</style>
<style name="MyTheme" parent="#android:style/Theme.Holo.Light">
<item name="android:actionBarStyle">#style/AppTheme.ActionBarStyle</item>
</style>
<style name="AppTheme.ActionBarStyle" parent="#android:style/Widget.Holo.Light.ActionBar">
<item name="android:titleTextStyle">#style/AppTheme.ActionBar.TitleTextStyle</item>
</style>
<style name="AppTheme.ActionBar.TitleTextStyle" parent="#android:style/TextAppearance.Holo.Widget.ActionBar.Title">
<item name="android:textColor">#color/colorBlack</item>
</style>
You should add
<item name="actionBarTheme">#style/MyTheme</item>
in AppTheme
A nice solution is to user a SpannableStringBuilder and set the color that way. You can even use different colors on different parts of the string, add images etc.
Tested with the new support library.
See Android: Coloring part of a string using TextView.setText()?
This is not the recommended solution as I am going in android apis here but as my application requires to change the theme dynmically on conditions xml not possible here, So I need to do this. But This solution is working very nice.
Solution:--
/**
*
* #author Kailash Dabhi
* #email kailash09dabhi#gmail.com
*
*/
public static void setActionbarTextColor(Activity activity, int color) {
Field mActionViewField;
try {
mActionViewField = activity.getActionBar().getClass()
.getDeclaredField("mActionView");
mActionViewField.setAccessible(true);
Object mActionViewObj = mActionViewField.get(activity
.getActionBar());
Field mTitleViewField = mActionViewObj.getClass().getDeclaredField(
"mTitleView");
mTitleViewField.setAccessible(true);
Object mTitleViewObj = mTitleViewField.get(mActionViewObj);
TextView mActionBarTitle = (TextView) mTitleViewObj;
mActionBarTitle.setTextColor(color);
// Log.i("field", mActionViewObj.getClass().getName());
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
}
}
For Android 5 (lollipop) you will have to use android:actionBarPopupTheme to set the textColor for the overflow menu.
you can change color of any text by use html <font> attribute directly in xml files.
for example in strings.xml :
<resources>
<string name = "app_name">
<html><font color="#001aff">Multi</font></html>
<html><font color="#ff0044">color</font></html>
<html><font color="#e9c309">Text </font></html>
</string>
</resources>
<android.support.v7.widget.Toolbar
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="#+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#color/color_primary"
android:theme="#style/GalaxyZooThemeToolbarDarkOverflow"
app:popupTheme="#style/Theme.AppCompat.NoActionBar" />
<style name="GalaxyZooThemeToolbarDarkOverflow" parent="Theme.AppCompat.NoActionBar">
<!-- android:textColorPrimary is the color of the title text
in the Toolbar, in the Theme.AppCompat theme: -->
<item name="android:textColorPrimary">#color/abc_primary_text_material_light</item>
<!-- android:textColorPrimaryInverse is the color of the title
text in the Toolbar, in the Theme.AppCompat.Light theme: -->
<!-- <item name="android:textColorPrimaryInverse">#color/abc_primary_text_material_light</item> -->
<!-- android:actionMenuTextColor is the color of the text of
action (menu) items in the Toolbar, at least in the
Theme.AppCompat theme.
For some reason, they already get the textColorPrimary
when running on API 21, but not on older versions of
Android, so this is only necessary to support older
Android versions.-->
<item name="actionMenuTextColor">#color/abc_primary_text_material_light</item>
<!-- android:textColorSecondary is the color of the menu
overflow icon (three vertical dots) -->
<item name="android:textColorSecondary">#color/abc_secondary_text_material_light</item>
<!-- This would set the toolbar's background color,
but setting this also changes the popup menu's background,
even if we define popupTheme for our <Toolbar> -->
<!-- <item name="android:background">#color/color_primary</item> -->
</style>
**Reference:**
[https://www.murrayc.com/permalink/2014/10/28/android-changing-the-toolbars-text-color-and-overflow-icon-color/][1]
If you need to set the color programmatically this is the way to do it:
static void setActionBarTextColor(Activity activity, int color)
{
ActionBar actionBar = activity instanceof AppCompatActivity
? ((AppCompatActivity) activity).getSupportActionBar()
: activity.getActionBar();
String title = activity.getTitle(); // or any title you want
SpannableString ss = new SpannableString(title);
ss.setSpan(new ForegroundColorSpan(color), 0, title.length(), Spanned.SPAN_INCLUSIVE_EXCLUSIVE);
actionBar.setTitle(ss);
}
In my case, I switched to AndroidX Toolbar instead of using the native action bar. Also, I rely on view binding to access the toolbar from the activity, but you can use findViewById(...) for that.
(I removed the code which is irrelevant).
styles.xml:
...
<style name="AppTheme" parent="Theme.MaterialComponents.Light.NoActionBar">
...
</style>
...
activity_main.xml:
...
<androidx.appcompat.widget.Toolbar
android:id="#+id/toolbarMain"
android:theme="#style/ThemeOverlay.AppCompat.ActionBar"
app:titleTextColor="#color/colorOnPrimary"
...
/>
...
MainActivity.kt:
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
...
override fun onCreate(savedInstanceState: Bundle?) {
...
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
setSupportActionBar(binding.toolbarMain)
...
}
...
}
We need to define the theme in our toolbar with app:theme attribute like the below code snippet.
<androidx.appcompat.widget.Toolbar
android:id="#+id/toolbar"
android:layout_width="match_parent"
android:layout_height="wrap_content"
app:theme="#style/AppTheme.ToolbarFont" />
Before that, we have to add the theme in our styles.xml file and we have to define font-family in that style like the below code snippet.
<style name="AppTheme.ToolbarFont" parent="AppTheme">
<!--This line changes the color of text in Toolbar-->
<item name="android:textColorPrimary">#color/black</item>
<!--This line changes the color of icons in toolbar (back, overflow menu icons)-->
<item name="android:textColorSecondary">#color/azul</item>
<item name="textAllCaps">false</item>
<item name="android:textSize">16sp</item>
<item name="android:fontFamily">#font/montserrat_semi_bold</item>
To add custom fonts we need to create a folder with the name “font” in the res directory like the below screenshot.
We have achieved a custom font in our toolbar.
If you are using a custom action bar you can use these properties:
app:titleTextColor="#color/...."
app:subtitleTextColor="#color/...."
or by a method like this:
setTitleTextColor()
for more properties check this link

Categories

Resources