androidviewstylesprogrammatically-created

Add Style after creating a View programmatically


The Title says it all, hopefully.

1) I create a View programmatically:

RelativeLayout rl = new RelativeLayout(this);

2) I want to add it to an existing LinearLayout and after that i want to add a Style to the RelativeLayout. Something like:

LinearLayout ll = (LinearLayout) findViewById(R.id.MyLinearLayout);
RelativeLayout rl = new RelativeLayout(this);
ll.addView(rl);
//add Style to rl here

I can't find a way to do that!

I know there are ways to add a Style programmatically. Something like:

RelativeLayout rl = new RelativeLayout(this, null, R.style.MyRelativeLayout);

But this will add the style before i've added the relativelayout to the linearlayout. Therefore the relativelayout isn't "printed" because how should he know that the linearlayout is his parent before i add it to the linearlayout.

Does anybody has a way how to add a Style programmatically to a view after this view has been created and added to a parent?

Hope you understand what i mean.


Solution

  • You can't apply a style after constructing a view. The correct way to do this is to use the 4-argument constructor on Android 5.0+ or to create a theme attribute that references your style and use the 3-argument constructor.

    // Works on versions prior to Android 5.0
    RelativeLayout rl = new RelativeLayout(this, null, R.attr.myRelativeLayoutStyle);
    
    // Works on Android 5.0 and above
    RelativeLayout r2 = new RelativeLayout(this, null, 0, R.style.MyRelativeLayout);
    

    res/values/attrs.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <attr name="myRelativeLayoutStyle" format="reference" />
        ...
    

    res/values/styles.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="MyRelativeLayout">
            ...
        </style>
        ...
    

    res/values/themes.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <style name="MyAppTheme" parent="...">
            <item name="myRelativeLayoutStyle">@style/MyRelativeLayout</item>
            ...