2012-08-24 6 views
7

Ich habe das Gefühl, dass ich früher wusste, wie man das macht, aber ich zeichne gerade eine Lücke. Ich habe eine Klasse, die sich von View (Card) erstreckt und ich habe ein Layout dafür in XML geschrieben. Was ich tun möchte, ist die Ansicht von Card als die XML-Ansicht im Konstruktor zu setzen, so dass ich die Methoden in Card verwenden kann, um TextView s und whatnot zu setzen. Irgendwelche Vorschläge? Code unten:Verwenden Sie XML-Layout als Ansicht für View Subclass?

Card.java. (Ich habe View.inflate(context, R.layout.card_layout, null); es als ein Beispiel das, was ich tun will, aber es funktioniert nicht Ich will im Grunde die Klasse die Schnittstelle für die Ansicht zu sein, und um das zu tun dass ich die XML-Layout Ansicht irgendwie zuordnen müssen. Muss ich etwas entlang der Linien von setContentView(View view) verwenden? es gibt keine solche Methode in der View Klasse, aber gibt es so etwas wie das?)

public class Card extends View { 

    TextView tv; 

    public Card(Context context) { 
     super(context); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View.inflate(context, R.layout.card_layout, null); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public void setText(String text) { 
     tv.setText(text); 
    } 

} 

card_layout. xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="336dp" 
    android:layout_height="280dp" 
    android:layout_gravity="center" 
    android:background="@drawable/card_bg" 
    android:orientation="vertical" > 


    <TextView 
     android:id="@+id/tv" 
     android:layout_height="fill_parent" 
     android:layout_width="wrap_content" 
     android:textSize="24dp" 
    /> 

</LinearLayout> 

Antwort

10

Was Sie versuchen zu tun ist nicht möglich, mit dem aktuellen Setup. A View (oder eine direkte Unterklasse davon) repräsentieren eine einzelne Ansicht es hat nicht die Vorstellung von Kind Ansichten, was Sie versuchen zu tun. Die LayoutInflater kann nicht mit einem einfachen View verwendet werden, da die einfache View Klasse nicht die Methoden hat, um tatsächlich das Kind, um es hinzuzufügen (wie die addView() Methode).

Auf der anderen Seite, die richtige Klasse verwenden zu können, Kinder haben, ist die ViewGroup (oder einer der direkten Unterklassen wie LinearLayout, FrameLayout usw.), die Views oder andere ViewGroups zu akzeptieren Zugabe, indem die addView Versorgung Methoden. Am Ende sollte Ihre Klasse sein:

public class Card extends ViewGroup { 

    TextView tv; 

    public Card(Context context) { 
     super(context); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public Card(Context context, AttributeSet attrs) { 
     super(context, attrs); 
     View.inflate(context, R.layout.card_layout, this); 
     tv = (TextView) findViewById(R.id.tv); 
    } 

    public void setText(String text) { 
     tv.setText(text); 
    } 

} 

Wenn ich mich erinnere Sie onLayout außer Kraft zu setzen, wenn Sie ViewGroup erweitern, so dass statt (und wegen Ihrer Layout-Datei), können Sie auf die Erweiterung LinearLayout aussehen sollte und ersetzen Sie die LinearLayout aus das XML-Layout mit einem merge Tag.

+0

Ich dachte darüber nach, meine Klasse "LinearLayout" erweitern zu lassen und dachte dann, es wäre eine dumme Idee.Ich habe es versucht, nachdem ich diesen Kommentar gesehen habe und es hat perfekt funktioniert! Vielen Dank! – roboguy12

3

Sie sollten Ihren Klassennamen im Layout verwenden können. Etwas wie:

<your.package.name.Card 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="336dp" 
    android:layout_height="280dp" 
    ... 

Rufen Sie einfach findViewById an, um Kinderansichten zu erhalten.

Um Ihre Kartenklasse zu verwenden, verwenden Sie den Inflator, um eine Instanz abzurufen, und fügen Sie sie dann einer übergeordneten Ansicht hinzu.

LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE); 
Card card = (Card) inflater.inflate(R.layout.card_layout, null); 
parentView.addView(card); 

Have a look at the docs for more info.

+0

Aber wie ist die 'card_layout.xml' mit der Klasse' Card' verbunden? Wenn ich das mache, was Sie oben geschrieben haben, erscheint nichts. – roboguy12

+0

Ich schaute auf die Dokumentation und es gibt viele Informationen über das programmatische Zeichnen einer benutzerdefinierten Ansicht, aber nichts über die Verwendung einer in XML definierten. Ich könnte alles mit Methoden und so zeichnen, aber es würde eine Weile dauern, da es ein ziemlich detailliertes Layout ist. – roboguy12

+0

Sie müssen eine Instanz von 'Card' zu einer anderen Ansicht hinzufügen, die Sie entweder mit' view.addView (Karte) 'oder mit' setContentView (Karte) 'für eine Aktivität verwenden. – devnate

Verwandte Themen