2016-07-29 12 views
0

Ich versuche, zwei Eigenschaften von attrs.xml wie content und handle zu verwenden. Wenn ich sie beim Erstellen des Layouts verwende, verschwindet die Ansicht. Ich habe den Bug seit 3 ​​Tagen ausprobiert und nichts hat funktioniert. Hilfe wird sehr geschätzt!Fehler im Layout, wenn ich Eigenschaften von attrs.xml verwende

-Code im Kontext

<hh.hhh.app.android.hhhh.widget.ExpandablePanel 
    android:id="@+id/expandablePanel" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 
    app:handle="@+id/expandButton" 
    app:content="@+id/listViewProduct" 
    app:collapsedHeight="50dip" 
    app:animationDuration="25"> 
    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:id="@+id/listViewProduct"/> 
    <Button 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/expandButton"/> 
</hh.hhh.app.android.hhhh.widget.ExpandablePanel> 

attrs.xml Code

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="ExpandablePanel"> 
     <attr name="handle" format="reference" /> 
     <attr name="content" format="reference" /> 
     <attr name="collapsedHeight" format="dimension"/> 
     <attr name="animationDuration" format="integer"/> 
    </declare-styleable> 
</resources> 
+4

welche Fehler helfen erhalten Sie? –

+1

Haben Sie xmlns: app = "http://schemas.android.com/apk/res-auto" in Ihrem Elternlayout hinzugefügt? Vergewissern Sie sich auch, dass "hh.hhh.app.android.hhhh.widget.ExpandablePanel" ist richtig Paketname – LvN

+0

danke für die Vorschläge @ LvN..ich stellte sicher, dass alle diese korrekt sind, bevor Sie die Frage –

Antwort

0

ich meine eigene benutzerdefinierte Klasse als Beispiel teilen bin. Für alle benutzerdefinierten Funktionen müssen Sie zuerst prüfen, ob sie sich in EditMode befinden oder nicht. isInEditMode() sagt uns, ist das Layout wird von IDE-Vorschau oder per Telefon übertragen werden. Die IDE-Vorschau ist nicht so leistungsfähig, um unsere benutzerdefinierten Codes zu verwenden. Daher wird empfohlen, beim Rendern in der Vorschau keine benutzerdefinierten Einstellungen auszuführen. Ich füge meine benutzerdefinierte Klasse an, um das genaue Szenario zu verstehen.

public class DynamicImageView extends ImageView { 
    static DynamicImageTypeListener masterImageTypeListener; 
    DynamicImageTypeListener imageTypeListener; 
    int imageResourceArray; 

    public DynamicImageView(Context context, AttributeSet attr, int defStyle) { 
     super(context, attr, defStyle); 
     initValues(attr, defStyle); 
    } 

    public DynamicImageView(Context context, AttributeSet attr) { 
     super(context, attr); 
     initValues(attr, 0); 
    } 

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

    public static void setMasterImageTypeListener(DynamicImageTypeListener masterImageTypeListener) { 
     DynamicImageView.masterImageTypeListener = masterImageTypeListener; 
    } 

    public void setImageTypeListener(DynamicImageTypeListener imageTypeListener) { 
     this.imageTypeListener = imageTypeListener; 
    } 

    private void initValues(AttributeSet attr, int defStyle) { 
     if (!isInEditMode()) { //This code will run only on phone not by preview. 
      TypedArray a = getContext().obtainStyledAttributes(attr, R.styleable.DynamicImageView, defStyle, 0); 
      imageResourceArray = a.getResourceId(0, 0); 
      updateImage(); 
      a.recycle(); 
     } 
    } 

    public void updateImage() { 
     TypedArray imgs = getResources().obtainTypedArray(imageResourceArray); 
     int imageIndex = imageTypeListener != null ? imageTypeListener.getImageType(getContext()) : (masterImageTypeListener != null ? masterImageTypeListener.getImageType(getContext()) : 0); 
     setImageResource(imgs.getResourceId(imageIndex, -1)); 
    } 
} 

Hope it :)