3

Ich habe dem Namen eine benutzerdefinierte Ansicht für meine app habe, ist AvatarView:Warum ist Android Studio-Designer meine benutzerdefinierte Ansicht in sich verschachtelt angezeigt wird, während es nicht

<?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 ist nur eine übergeordnete Klasse von RelativeLayout mit einem kleine Reparatur, nichts besonderes dort. Dann habe ich eine Ansicht, die meine benutzerdefinierte Ansicht verwendet:

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

Nichts auch nicht. Aber in der Entwurfsansicht des zweiten Layout XML, erhalte ich dieses:

enter image description here

Der Editor zeigt meiner Ansicht Hierarchie wie es eine verschachtelte Instanz von sich selbst hat, während klar ist es nicht. Wenn ich eines lösche, werden beide gelöscht. Wenn ich Attribute auf einem von ihnen deklariere, bekommt es auch ein anderer. Sie sind eindeutig die gleiche Instanz. Die einzige Ausnahme ist das Festlegen einer ID. Dann verschwindet das Problem und nur eine einzelne Instanz wird wie erwartet angezeigt.

Ich habe das Projekt neu erstellt, Android Studio neu gestartet, aber es ist immer noch das gleiche. Was mache ich falsch?

UPDATE: Nein, jetzt, nach der Bearbeitung id, geht das Problem immer noch weiter.

UPDATE 2: Es ist nicht nur ein Layout, so dass ich <include> Tag nicht verwenden kann. Es ist eine benutzerdefinierte Ansicht, die benutzerdefinierte Logik enthält.

UPDATE 3: Hier ist meine benutzerdefinierte Ansicht (relevanter) Code:

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

} 

UPDATE 4: Es scheint, dass dies überall geschieht ich meine benutzerdefinierten AvatarView Klasse setzen, nicht nur an einem Ort.

+0

Auf jeden Fall seltsam. Ist es möglich, dass es in Ihrer Aktivitätsklasse etwas gibt, das zusätzlich zu der in der XML-Layoutdatei eine Ansicht programmatisch hinzufügt? –

+0

@JoshuaCarmody das war genau das, was ich auch dachte. Es gibt nur einen Platz, an dem ich ein einzelnes XML aufblase, und es ist auf dem Initialisierungscode, der gerade vom Konstruktor (offensichtlich einmal) und sonst nirgends aufgerufen wird. und das erste XML ist das, das ich in meiner Frage gepostet habe. –

+0

Haben Sie dasselbe mit einer anderen 'CustomView' in einer anderen Datei versucht? –

Antwort

0

Ich habe keinen Grund gefunden, dieselbe Ansicht in Ihrer Klassenkonstruktormethode aufzublasen, nachdem Sie die custom views documentation überprüft haben. Versuchen Sie, die Inflation in Ihrer Init-Methode zu entfernen.

... 

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

... 
+0

Es ist * nicht * nur ein Layout. Es ist eine benutzerdefinierte Ansicht mit benutzerdefinierter Logik. –

+0

können Sie Ihre benutzerdefinierte Ansichtsklasse hier teilen? –

+0

Ich habe den Code hinzugefügt. Siehe meine aktualisierte Frage. –

Verwandte Themen