Android Studio - How to inflate an xml layout containing a view that use percentage params

96 Views Asked by At

I am here because I would like to use multiple times the same cardView layout, changing simply some information contained in it and then adding it to a view contained in the main xml layout. The problem is that the view to which append the created cardViews is a PercentRelativeLayout, so I need to specify cardView's xml layout using Percent params.

I show you an example of what I tried (with no success) to make it a bit more clear.

main_layout.xml

<ScrollView
            android:id="@+id/scrollview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/textview"
            percent:layout_heightPercent="85%"
            percent:layout_marginTopPercent="0.5%">

            <android.support.percent.PercentRelativeLayout
                android:id="@+id/scrollview_prl"
                android:layout_width="match_parent"
                android:layout_height="match_parent">


                ...here I want to add views programmatically...


            </android.support.percent.PercentRelativeLayout>

                                 ...

cardView_layout.xml

<?xml version="1.0" encoding="utf-8"?>

 <android.support.v7.widget.CardView
    xmlns:percent="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    percent:layout_heightPercent="65%"
    percent:layout_marginTopPercent="2%"
    percent:layout_marginLeftPercent="2%"
    percent:layout_marginRightPercent="2%"
    card_view:cardCornerRadius="2dp"
    card_view:cardElevation="4dp">
</android.support.v7.widget.CardView>

Then, this is the piece of Java code I wrote (in a fragment, but this does not matter now)

myfragment.java

     ...
    CardView cv = (CardView) 
LayoutInflater.from(getActivity()).inflate(R.layout.cardView_layout, null)
     cv.setId(currentId++);
    PercentRelativeLayout prl = (PercentRelativeLayout) 
    view.findViewById(R.id.scrollview_prl);
    prl.addView(cv);
    ...

As you can see I simply keep a currentId variable to assign different ids to the cardviews I am going to create. Clearly, these cardviews must be one below the other, and I do not even know how to add this other param to them programmatically.

The final layout I would like to obtain is something like this:

<ScrollView
            android:id="@+id/scrollview"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_below="@id/textview"
            percent:layout_heightPercent="85%"
            percent:layout_marginTopPercent="0.5%">

            <android.support.percent.PercentRelativeLayout
                android:id="@+id/scrollview_prl"
                android:layout_width="match_parent"
                android:layout_height="match_parent">


                <android.support.v7.widget.CardView
                    xmlns:percent="http://schemas.android.com/apk/res-auto"
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:card_view="http://schemas.android.com/apk/res-auto"
                    android:id="@id/firstcardview"
                    android:layout_width="match_parent"
                    percent:layout_heightPercent="65%"
                    percent:layout_marginTopPercent="2%"
                    percent:layout_marginLeftPercent="2%"
                    percent:layout_marginRightPercent="2%"
                    card_view:cardCornerRadius="2dp"
                    card_view:cardElevation="4dp">
                </android.support.v7.widget.CardView>

                <android.support.v7.widget.CardView
                    xmlns:percent="http://schemas.android.com/apk/res-auto"
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:card_view="http://schemas.android.com/apk/res-auto"
                    android:id="@id/secondcardview"
                    android:layout_width="match_parent"
                    percent:layout_heightPercent="65%"
                    percent:layout_marginTopPercent="2%"
                    percent:layout_marginLeftPercent="2%"
                    percent:layout_marginRightPercent="2%"
                    card_view:cardCornerRadius="2dp"
                    card_view:cardElevation="4dp">
                </android.support.v7.widget.CardView>

                <android.support.v7.widget.CardView
                    xmlns:percent="http://schemas.android.com/apk/res-auto"
                    xmlns:android="http://schemas.android.com/apk/res/android"
                    xmlns:card_view="http://schemas.android.com/apk/res-auto"
                    android:id="@id/thirdcardview"
                    android:layout_width="match_parent"
                    percent:layout_heightPercent="65%"
                    percent:layout_marginTopPercent="2%"
                    percent:layout_marginLeftPercent="2%"
                    percent:layout_marginRightPercent="2%"
                    card_view:cardCornerRadius="2dp"
                    card_view:cardElevation="4dp">
                </android.support.v7.widget.CardView>

                                ....


            </android.support.percent.PercentRelativeLayout>

                                 ...

Thanks in advance for your help.

1

There are 1 best solutions below

1
On

The problem is in your inflate() call. You have to pass a parent value in order for the inflated view's LayoutParams to be interpreted correctly.

Try this instead:

CardView cv = (CardView) LayoutInflater.from(getActivity()).inflate(R.layout.cardView_layout, prl, false);

By passing prl (the PercentRelativeLayout) to inflate(), everything should work.