changing text color globally with new style - android

EDIT: My line in AndroidManifest was wrong. It should have been
android:theme="#style/CustomTheme"
Now all the text color has changed. Not the button color but I am on my way. Thanks for the help.
This must be an easy answer but I keep getting errors. I am, as far as I can tell, following the Android documentation HERE but it doesn't work. I have read many stactoverflow threads on this issue and trying to follow what seemed like the best one. The goal is to change the text color globally in an already complete project.
This is in res/values/styles.xml
<resources>
<style name="style_name" parent="#android:style/Theme.Black">
<item name="android:textColor">#00FF00</item>
</style>
</resources>
I reference it in AndoridMinafest.xml
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#android:style/style_name"
>
What I am trying to do is keep the basic style of Theme.Black but change the text color.
What am I doing wrong? The line android:theme="#android:style/style_name" in AndroidManifest generates an error which then errors out every class.

I was close, just a typo but as I was unable to find an answer to this on the web and found lots of people asking I thought I would document exactly what ended up working. This did not work for the cases where I had hard coded a color but I would not expect that to happen. This did change all the default text colors.
AndroidManifest was modified like this:
<application
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/CustomTheme"
>
And the file res/values/styles.xml looks like this:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CustomTheme" parent="android:Theme.Black">
<item name="android:textColor">#ffff00</item>
</style>
</resources>
And this works. All the text is yellow -- except the text defined as
android:textColor="#android:color/white"
And that is another story. I will have to edit each instance to change that.

Related

Using theme generated by Holo Style Generator

I managed to get this done a few days back but now I've forgotten what steps I took to make it work.
I've generated a custom widget theme from http://android-holo-colors.com
I've copied it to my res folder. I need to know what to change in the manifest and the styles.xml file to make it work with my app. I've tried a lot of different things but the theme either doesn't change or generates and xml error.
manifest.xml
<activity
android:name="com.yourapp.app"
android:label="#string/app_name"
android:screenOrientation="landscape"
android:theme="#style/Theme.YourTheme"
...
</activity>
res/values/styles.xml
<style name="YourTheme" parent="android:Theme.Light">
...
</style>

Themes in android

A create a simple Theme as
<style name='one'>
<item name='android:textColor'>#eea</item>
<item name='android:textSize'>20sp</item>
</style>
However on viewing in the emulator the screen goes black.when i do not apply theme the screen has a white background .
what really happens here.i am just starting with android.
In addition ,if a apply a theme to my activity then the attributes of the theme applies to all components of my activity say button,textfields and edittexts .
why would i then write
android:textSize=?android:textSize
to reference value from the theme for any button in my layout when the same value would already be applying.
is the syntax above the correct way to reference an attribute from my theme to assign to attribute for any view in my layout.
thanks
tejinder
Yeah, so you need to do a little more reading.
Let's start with the basics,
You need to understand the differente betweent an Attribute, a Style, and a Theme.
An Attribute is something that can be styled. For instance: android:textSize is an attribute that can have any value.
A Style is a set of specific attributes that will be applied to a Widget. They are defined
in your /values/styles.xml
For instance:
<style name="normalTextThin" parent="android:Widget.Holo.Light.TextView">
<item name="android:gravity">left|center_vertical</item>
<item name="android:padding">8dp</item>
<item name="android:textColor">#FFFFFF</item>
<item name="android:textSize">16sp</item>
</style>
The styles can be applied either as part of a theme or directly as theme-independent.
Theme-indepentent styling of a widget is like this:
<TextView
android:id="#+id/text"
style="#style/normalTextThin"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
You are then theming only that one TextView.
A Theme is a collection of Styles that can be applied to a part of your UI, such a a whole Activity, or your whole Application.
For instance:
<style name="AppTheme" parent="android:Theme.Light">
<item name="android:editTextStyle">#style/EditTextAppTheme</item>
<item name="android:buttonStyle">#style/ButtonAppTheme</item>
<item name="android:imageButtonStyle">#style/ImageButtonAppTheme</item>
</style>
Here, we are declaring that all EditText in your application will use the style named EditTextAppTheme, and so forth and on. When done like this, in order to actually have the theme be active, you declare it in the manifest:
<application
android:allowBackup="true"
android:icon="#drawable/ic_launcher"
android:label="#string/app_name"
android:theme="#style/AppTheme" >
That means that you are not required to declare the style on each widget you create.
<EditText
android:id="#+id/input"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:hint="#string/hint_search">
<requestFocus />
</EditText>
That widget right there would already be styled using EditTextAppTheme without the need of you explicitely declaring so.
I recommend you try to read on what attributes can be styled, how to style them, and so forth and on.
If you don't want to though, it's fine, you can still get a lot done with the following tools for styling:
ActionBarStyleGenerator to help you create styles for the ActionBar.
Android Holo Colors to help you style standard widgets.
Hope that helps.
Additional Info
Let me clarify on the whole ?attr/attributeName
The ? means that the system will choose the specific attributeName value for the current Configuration (not specific to different themes). This should be used only when you want the value to be different on different configurations. For example:
?android:attr/actionBarSize
This line is a dimension, and it will be different not based on the current theme, but on the current device screen size and orientation (values, values-land, values-sw600dp).
It's important to know that specifying ?android: means you are accessing preset Android values, not yours. If you have or want to create and use your own attribute values for specific configurations, you must do the following:
Create a file named attrs.xml on your /values/ folder.
Declare the desired custom attribute:
<?xml version="1.0" encoding="UTF-8"?>
<resources>
<attr name="my_custom_attr" format="reference" />
</resources>
Declare a value for the custom attribute, let's say on your own theme.
<style name="AppTheme" parent="android:Theme.Light">
<item name="my_custom_attr">#resource_type/resource_name</item>
<item name="android:editTextStyle">#style/EditTextAppTheme</item>
<item name="android:buttonStyle">#style/ButtonAppTheme</item>
<item name="android:imageButtonStyle">#style/ImageButtonAppTheme</item>
</style>
And then you can use it on the Widget you'd like:
Hope that clears things out.
EDIT 2
For a better answer to your question, please update your question. And like I said, read more on how to properly create styles.
The Theme named 'one', what do you want to apply it to? An activity, a Widget, the whole Application?
How are you applying the theme? Show the lines of code where you specify the usage of theme 'one'.
Your theme as you specified is simply not a properly constructed theme/style.
<style name='one'>
<item name='android:textColor'>#eea</item>
<item name='android:textSize'>20sp</item>
</style>
This says absolutely nothing, and it is definitely not suitable for an Activity-level theme. The reason you specify a parent is so your theme can inherit all of the attributes from the parent, and then you specifiy which ones to change.
For instance, if you want to use your theme and have a light background, do this:
<style name='one' parent="android:Theme.Holo.Light>
<item name='android:textColor'>#eea</item>
<item name='android:textSize'>20sp</item>
</style>
But even here, despite the fact that it will apply, you don't want to have the same text color and size for the whole application do you? That'd be nonsense, different text color and sizes account for a big part of the user experience, so rather than setting those values from what we can refer to as the main style, we can create substyles and apply them to certain widgets.
I can't really go any more detailed that what I already have, the above explains how to accomplish Widget-specific styling, and activity/application level theming.
For a complete start-up guide, read the Android Developer Site, try the test styles declared there, see how they work, and until then try to create your own, don't try to create something out of nowhere if no reading has been made.

How to ensure android uses the default font?

I'm building an app and want to make sure it uses the default "sans" fonttype that android supplies.
I installed some strange font and set it as the font my phone uses so I can test if my actions are working.
Then I changed the theme that is used by all my screens so it includes the following line:
<item name="android:typeface">sans</item>
This does not have any effect though...
If I change the theme-typeface line to:
<item name="android:typeface">serif</item>
Then it does work, the odd font does not show, but I get the default android serif font...
The same happens when I use monospace...
But when I use sans (or normal) it uses the newly installed font.
Does anyone know a good way to accomplish this?
Edit: I need a way to set it for the whole app, not for every item separately
Edit2: Even if I set it in the xml it does not work.
By now I think serif has effect becouse the odd font does not have a serif version.
So android defaults to its own font then.
How can I make andoid use its own build-in font always?
You can do this,
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:typeface="serif"
android:text="#string/hello" />
Becomes this:
<TextView
style="#style/CodeFont"
android:text="#string/hello" />
By defining an xml theme file:
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="CodeFont" parent="#android:style/TextAppearance.Medium">
<item name="android:layout_width">fill_parent</item>
<item name="android:layout_height">wrap_content</item>
<item name="android:textColor">#00FF00</item>
<item name="android:typeface">shreif</item>
</style>
</resources>
You can also apply styles to all activities of an application:
<application android:theme="#style/CustomTheme">
Or just one activity:
<activity android:theme="#android:style/Theme.Dialog">
This was a question I had some time ago and never found the answer for.
Thats OK. I think in the end: Every supplier of a device can give you another default font.
So I decided to package "my own" font in the app.
(Ah well, I guess everybody here is learning)

Android - how to set background color of all screens?

What is the best practice to maintain styles of fonts and colors. I made a colors.xml file which I have used to change colors on seperate elements like buttons, but I am not sure how Android wants developers to organize their styles.
For example, I would like all screens to have the same background color. How do I do that? Is it something I need to specify for each Activity layout xml? Or elsewhere? How do I accomplish it?
A quick and easy way to make sure every activity has the same background color, is to create a theme for your activities to use. That theme would specify the android:windowBackground.
First define the color in values/colors.xml
<resources>
<color name="background">#FF0000 </color>
</resources>
Create a themes.xml file in res/values that references that color:
<resources>
<style name="MyTheme" parent="#android:style/Theme.Light">
<item name="android:windowBackground">#color/background</item>
</style>
</resources>
... and then in your AndroidManifest.xml specify this as the theme for your activities to use.
<activity
android:name=".MyActivity"
android:theme="#style/MyTheme" />
Update your android studio to 1.4 it has inbuilt theme editor. as you can see in below image
You can also set the background at the application level in AndroidManifest.xml
<application
...
android:theme="#style/MyTheme">
(Note: I cannot this as a comment of the accepted answer as my reputation is too low).

How to set a universal background for an application

I am trying to set a background for every XML layout in my application, and I am using the same picture for them all. At the moment, I am going through all hundred or so layouts and just typing in the code:
android:background="#drawable/dirtwall"
Into all of the layouts. How would I be able to set it automatically so I wouldn't have to change other backgrounds as I made more, and so I wouldn't have to go through all of my XML files?
Also, I am using Eclipse.
You can use styles. This way, you can define all common elements in a single place and then update it only there.
Example style.xml, which should be located in your project's /res/values/ folder
<?xml version="1.0" encoding="utf-8"?>
<resources>
<style name="appearance">
<item name="android:background">#drawable/dirtwall</item>
</style>
</resources>
and use it like
<LinearLayout
...
style = "#style/appearance"
>
Apply a theme to an Activity or application
To set a theme for all the activities of your application, open the AndroidManifest.xml file and edit the <application> tag to include the android:theme attribute with the style name. For example:
<application android:theme="#style/CustomTheme">
If you want a theme applied to just one Activity in your application, then add the android:theme attribute to the <activity> tag instead.
if you want the background to be transparent, use the Translucent theme:
<activity android:theme="#android:style/Theme.Translucent">
here is the declaration for a custom theme which is simply the standard platforms default light theme. It would go in an XML file under
res/values (typically res/values/styles.xml):
<style name="CustomTheme" parent="android:Theme.Light">
...
</style>

Categories

Resources