tejinder
tejinder

Reputation: 61

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

Upvotes: 0

Views: 197

Answers (1)

daniel_c05
daniel_c05

Reputation: 11548

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:

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.

  1. The Theme named 'one', what do you want to apply it to? An activity, a Widget, the whole Application?
  2. 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.

Upvotes: 1

Related Questions