Почему дизайнер Android Studio отображает мое собственное представление, вложенное в себя, а не

У меня есть собственное представление для моего приложения с именем AvatarView:

<?xml version="1.0" encoding="utf-8"?>
<com.ulouder.views.AdvancedRelativeLayout android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_gravity="center_horizontal"
    android:layout_margin="0dp"
    android:padding="0dp"
    xmlns:android="http://schemas.android.com/apk/res/android">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="CP"
        android:id="@+id/initialsView"
        android:layout_alignTop="@+id/avatarView"
        android:layout_alignLeft="@+id/avatarView"
        android:layout_alignBottom="@+id/avatarView"
        android:layout_alignRight="@+id/avatarView"
        android:background="@drawable/avatar_background"
        android:textColor="@color/white"
        android:gravity="center"
        android:textStyle="bold"
        android:textSize="8sp" />

    <com.makeramen.roundedimageview.RoundedImageView
        app:riv_corner_radius="20dp"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/avatarView"
        android:layout_alignParentTop="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true"
        android:layout_marginTop="4dp"
        android:layout_marginLeft="4dp"
        android:layout_marginBottom="4dp"
        app:riv_border_color="@color/lightGray"
        app:riv_border_width="0.2dp" />

</com.uLouder.views.AdvancedRelativeLayout>

AdvancedRelativeLayout это просто суперкласс RelativeLayout с небольшим исправлением, ничего особенного там нет. Затем я создал представление, которое использует мой пользовательский вид:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
<com.ulouder.views.AvatarView
    android:layout_width="50dp"
    android:layout_height="50dp"/>

</LinearLayout>

Ничего особенного. Но в представлении конструктора второго макета XML я получаю следующее:

Редактор отображает мою иерархию представлений так, как будто у нее есть собственный вложенный экземпляр, хотя явно нет. Если я удаляю любой из них, они оба удаляются. Если я объявляю атрибуты на одном из них, другой также получает его. Это явно один и тот же экземпляр. Единственным исключением является установка идентификатора. Тогда проблема исчезает, и только один экземпляр отображается как ожидалось.

Я перестроил проект, перезапустил Android Studio, но он все тот же. Что я делаю неправильно?

ОБНОВЛЕНИЕ: Нет, сейчас, после редактирования idПроблема все еще продолжается.

ОБНОВЛЕНИЕ 2: Это не просто макет, поэтому я не могу использовать <include> тег. Это пользовательский вид, который имеет собственную логику внутри.

ОБНОВЛЕНИЕ 3: Вот мой (соответствующий) код моего пользовательского представления:

public class AvatarView extends FrameLayout {
    public AvatarView(Context context) {
        super(context);
        init();
    }

    TextView initialsView;
    RoundedImageView imageView;


    public AvatarView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    void init(){
        inflate(getContext(), R.layout.view_avatar, this);
        initialsView = (TextView) findViewById(R.id.innerInitialsView);
        imageView = (RoundedImageView) findViewById(R.id.innerImageView);
    }

    @SuppressWarnings("SuspiciousNameCombination")
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, widthMeasureSpec); //always square
        imageView.setCornerRadius(widthMeasureSpec / 2f);
        initialsView.setTextSize(TypedValue.COMPLEX_UNIT_DIP, widthMeasureSpec * 30f);
    }

}

ОБНОВЛЕНИЕ 4: кажется, что это происходит везде, где я положил свой обычай AvatarView класс, а не только в одном месте.

1 ответ

Я не нашел причин для того, чтобы раздувать то же представление внутри вашего метода конструктора классов после проверки документации по пользовательским представлениям. Попробуйте удалить инфляцию внутри вашего метода init.

...

public AvatarView(Context context) {
    super(context);
    init();
}

...

public AvatarView(Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
}

void init(){
//  inflate(getContext(), R.layout.view_avatar, this);
    initialsView = (TextView) findViewById(R.id.innerInitialsView);
    imageView = (RoundedImageView) findViewById(R.id.innerImageView);
}

...