-
-
Save romannurik/7026222 to your computer and use it in GitHub Desktop.
<manifest ...> | |
... | |
<!-- Make sure your app (or individual activity) uses the | |
theme with the custom attribute defined. --> | |
<application android:theme="@style/AppTheme" ...> | |
... | |
</application> | |
</manifest> |
public class MyActivity extends Activity { | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
... | |
// Pass in the theme attribute that'll resolve to the | |
// desired button style resource. The current theme | |
// must have a value set for this attribute. | |
Button myButton = new Button(this, null, R.attr.myButtonStyle); | |
myButton.setText("Hello world"); | |
ViewGroup containerView = (ViewGroup) findViewById(R.id.container); | |
containerView.addView(myButton); | |
} | |
} |
<!-- The convention is to put the <style> elements below | |
in res/values/styles.xml and <declare-styleable> in | |
res/values/attrs.xml. --> | |
<resources> | |
<!-- First declare a custom theme attribute that'll | |
reference a style resource. --> | |
<declare-styleable name="AppTheme"> | |
<attr name="myButtonStyle" format="reference" /> | |
</declare-styleable> | |
<!-- Provide a style resource as the value for the | |
theme attribute. As a side note, if you want to | |
change the default button style, you can instead | |
override the android:buttonStyle attribute. --> | |
<style name="AppTheme" parent="android:Theme.Holo"> | |
<item name="myButtonStyle">@style/MyButton</item> | |
</style> | |
<!-- Define the custom button style itself. Make sure | |
to inherit from an existing button style. --> | |
<style name="MyButton" parent="android:Widget.Holo.Button"> | |
<item name="android:textColor">#f00</item> | |
</style> | |
</resources> |
Very useful indeed, thanks Roman. This should definitely be included into the official documentation for Themes & Styles (http://developer.android.com/guide/topics/ui/themes.html)
For me this does not apply layout params like layout_width, layout_height when I have them in my style. Only default wrap_content LayoutParams gets created in both dimensions
@cesards: Note that you're using a direct style (i.e.R.style
) as opposed to an attribute (i.e. R.attr
). This tripped me up as well. Difference being, attributes reference styles.
Very useful! :)
@ursusursus: Setting any global style in theme never set layout_*
parameters from style like layout_width
or layout_margins
Thank you so much!!! I wasn't being able to get a custom button to be displayed properly and your example was REALLY useful, thanks!!
Button myButton = new Button(this, null, R.attr.myButtonStyle);
@cesards The code above does not inject the current context if not used in Activity. Instead use:
Button myButton = new Button(new ContextThemeWrapper(context, R.attr.myButtonStyle), null, 0);
or if you use AppCompat:
Button myButton = new AppCompatButton(new ContextThemeWrapper(context, R.attr.myButtonStyle), null, 0);
Thanks for the info!
@romannurik This is not working for me. Maybe there is an android bug?
If I use:
where
And TextView initialization does:
But it doesn't recognize fontFamily attribute :S Is it a normal behaviour?