Last active
March 7, 2024 11:13
-
-
Save romannurik/7026222 to your computer and use it in GitHub Desktop.
Android example of how to programmatically instantiate a View with a custom style.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<manifest ...> | |
... | |
<!-- Make sure your app (or individual activity) uses the | |
theme with the custom attribute defined. --> | |
<application android:theme="@style/AppTheme" ...> | |
... | |
</application> | |
</manifest> |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- 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> |
@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!
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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