Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 965
Mike Avatar asked Dec 08 '22 05:12

Mike


1 Answers

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>
        ...
like image 102
alanv Avatar answered Dec 22 '22 18:12

alanv