Создайте пользовательский вид в стиле LinearLayout - PullRequest
0 голосов
/ 05 января 2020

Представьте, что у вас был следующий дизайн для карты, которую вы будете использовать через приложение. Заголовок, кнопка, разделитель, а затем место для динамического содержимого c, обозначенного синим прямоугольником. Мы можем добавить все, что нам нужно, в синюю область, но рамка для содержания будет согласованной. Например:

Карта с регистром-заполнителем

Если я собираюсь поместить две TextView внутри, это может выглядеть так, с видом (обрезанным) компоновка ниже:

Карта с двумя TextViews

<com.google.android.material.card.MaterialCardView>
    <LinearLayout android:orientation="vertical">

        <LinearLayout android:orientation="horizontal">
            <TextView android:text="My Title" />
            <com.google.android.material.button.MaterialButton android:text="ACTION" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#000" />

        <LinearLayout android:id="+@id/contentGoesHere">
            <TextView android:text="First element" />
            <TextView android:text="Second element" />
        </LinearLayout>

    </LinearLayout>
</com.google.android.material.card.MaterialCardView>

В идеале я хотел бы, чтобы пользовательский вид так, чтобы разработчики могли просто делать следующее и получать последовательную информацию, или добавьте к представлению программно:

<com.customview.CustomView>
    <TextView android:text="First element" />
    <TextView android:text="Second element" />
</com.customview.CustomView>

Моя проблема в том, что просто расширение LinearLayout и создание пользовательского представления не будут работать - это создаст макет, но нет никакого способа указать, что внутренний LinearLayout это то, к чему я хочу добавить представления, поэтому все подпредставления, добавленные в XML, игнорируются.

Нужно ли создавать пользовательский ViewGroup и вручную раздувать пользовательский держатель для * 1023? * (помогите! onMeasure и onLayout !?) или есть более простой способ сделать пользовательский LinearLayout вид с помощью этой стилизованной рамки вокруг него?

1 Ответ

0 голосов
/ 05 января 2020

Моя проблема в том, что простое расширение LinearLayout и создание собственного представления не сработает - это создаст макет, но нет никакого способа указать, что внутренний LinearLayout - это то, к чему я хочу добавить представления, поэтому любой подпредставления, добавленные в XML, игнорируются.

Вы можете вручную переместить дочерние представления во вложенные LinearLayout.

Например:

public class CustomView extends LinearLayout {

    public CustomView(Context context) {
        super(context);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public CustomView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();

        final ViewGroup container = inflate(getContext(), R.layout.card_layout, this)
                .findViewById(R.id.inner_content_container);
        while (getChildCount() > 1) {
            final View child = getChildAt(0);
            removeView(child);
            container.addView(child, child.getLayoutParams());
        }
    }
}

card_layout. xml

<com.google.android.material.card.MaterialCardView>
    <LinearLayout android:orientation="vertical">

        <LinearLayout android:orientation="horizontal">
            <TextView android:text="My Title" />
            <com.google.android.material.button.MaterialButton android:text="ACTION" />
        </LinearLayout>

        <View
            android:layout_width="match_parent"
            android:layout_height="1dp"
            android:background="#000" />

        <LinearLayout
            android:id="@+id/inner_content_container"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="vertical">
            <!-- content goes here -->
        </LinearLayout>

    </LinearLayout>
</com.google.android.material.card.MaterialCardView>

...

<com.customview.CustomView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">
    <TextView android:text="First element" />
    <TextView android:text="Second element" />
</com.customview.CustomView>
...