Android Studio - Как надуть макет xml, содержащий представление, использующее процентные параметры

Я здесь, потому что я хотел бы использовать несколько раз один и тот же макет cardView, просто изменив некоторую информацию, содержащуюся в нем, а затем добавив его в представление, содержащееся в основном макете xml. Проблема в том, что представление, к которому добавляются созданные cardViews, представляет собой PercentRelativeLayout, поэтому мне нужно указать макет xml cardView с использованием параметров Percent.

Я покажу вам пример того, что я пытался (но безуспешно), чтобы сделать это немного более понятным.

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>

Затем, это фрагмент кода Java, который я написал (фрагмент, но это не имеет значения сейчас)

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);
    ...

Как вы можете видеть, я просто сохраняю переменную currentId, чтобы назначать разные идентификаторы картам, которые я собираюсь создать. Ясно, что эти карточки должны быть один под другим, и я даже не знаю, как программно добавить к ним этот другой параметр.

Окончательный макет, который я хотел бы получить, выглядит примерно так:

<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>

                                 ...

Заранее спасибо за помощь.

1 ответ

Проблема в вашем inflate() вызов. Вы должны пройти parent значение для правильной интерпретации LayoutParams завышенного представления.

Попробуйте это вместо этого:

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

Мимоходом prl (PercentRelativeLayout) для inflate()все должно работать.

Другие вопросы по тегам