2010-12-14 15 views
7

Ich möchte eine benutzerdefinierte View auf Android erstellen. Ich habe versucht, es so einfach wie möglich zu tun und erstellte eine fast leere Klasse MyView und verwendete es in meinem LinearLayout, aber die Anwendung scheitert am Anfang mit "Force Close". Wie kann ich eine einfache benutzerdefinierte View? Gemäß Building Custom Components erhält die View die Größe 100x100, wenn ich onMeasure() nicht überschreibe.Wie erstelle ich eine einfache benutzerdefinierte Ansicht?

public class MyView extends View { 

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

Und ich benutze es in einer LinearLayout mit:

<view 
    class="com.example.MyView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" /> 

Was mache ich falsch?


Wenn ich den Konstruktor verwenden, die vorschlagen itemon und den entsprechenden Aufruf der übergeordneten Klasse. Dann ist der "Force Close" weg, aber mein LinearLayout ist kaputt, die Komponenten nach MyView werden nicht angezeigt. Hier

ist mein main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:orientation="vertical" 
    > 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" 
    android:background="#f00" 
    android:text="Hello" 
/> 
<view 
    class="com.example.MyView" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" 
/> 
<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="0.0" 
    android:background="#00f" 
    android:text="World" 
/> 
</LinearLayout> 
+0

Sie können ein gutes Beispiel hier konsultieren: [http://www.sgoliver.net/blog/?p=1457](http://www.sgoliver.net/blog/?p=1457) –

+0

Ich habe ähnliches braucht .. hast du was du brauchst. . Teilen Sie einen Code plz – Nepster

Antwort

9

sein können Sie einen anderen Konstruktor Methode wie folgt definieren könnte:

public MyView(Context context, AttributeSet attrs) 

das Android Framework wird versuchen, die Benutzeroberfläche mit dem Blick aus dem Konstruktor oben zu bauen .

+0

Danke, das ist die "Force Close" Nachricht entfernt, aber meine 'LinearLayout' ist gebrochen, die Komponente nach wird nicht angezeigt. – Jonas

+2

Ich musste 'onMeasure()' auch überschreiben. Jetzt funktioniert es großartig. – Jonas

9

Das Android-Entwicklerhandbuch enthält einen Abschnitt namens Benutzerdefinierte Komponenten erstellen. Leider behandelt die Diskussion von XML-Attributen nur das Deklarieren des Steuerelements in der Layoutdatei und nicht das tatsächliche Behandeln der Werte innerhalb der Klasseninitialisierung. Die Schritte sind wie folgt:

Declare in Werte Attribute \ attrs.xml

<?xml version="1.0" encoding="utf-8"?> 
<resources> 
    <declare-styleable name="MyCustomView"> 
     <attr name="android:text"/> 
     <attr name="android:textColor"/>    
     <attr name="extraInformation" format="string" /> 
    </declare-styleable> 
</resources> 

Hinweis die Verwendung eines nicht qualifizierten Namen in der declare-styleable-Tag. Nicht-Standard-Android-Attribute wie extraInformation müssen ihren Typ deklariert haben. In der Oberklasse deklarierte Tags sind in Unterklassen verfügbar, ohne dass sie neu deklariert werden müssen.

Konstrukteure erstellen

Da es zwei Konstruktoren, die eine AttributeSet zur Initialisierung verwenden, ist es zweckmäßig, eine separate Initialisierungsmethode für die Konstrukteure erstellen aufzurufen.

private void init(AttributeSet attrs){ 
    TypedArray a=getContext().obtainStyledAttributes(attrs,R.styleable.MyCustomView); 
    //Use a 
    Log.i("test",a.getString(R.styleable.MyCustomView_android_text)); 
    Log.i("test",""+a.getColor(R.styleable.MyCustomView_android_textColor, Color.BLACK)); 
    Log.i("test",a.getString(R.styleable.MyCustomView_android_extraInformation)); 
    //Don't forget this 
    a.recycle(); 
} 

R.styleable.MyCustomView ist eine automatisch generierte int [] Ressource in der jedes Element die ID eines Attributs ist. Attribute werden für jede Eigenschaft im XML generiert, indem der Attributname an den Elementnamen angehängt wird. Attribute können dann mit verschiedenen Get-Funktionen aus dem TypedArray abgerufen werden. Wenn das Attribut nicht im XML-Code definiert ist, wird null zurückgegeben. Außer natürlich, wenn der Rückgabetyp ein Primitiv ist, in welchem ​​Fall das zweite Argument zurückgegeben wird.

Wenn Sie nicht alle Attribute abrufen möchten, können Sie dieses Array manuell erstellen. Die ID für Standard-Android-Attribute ist in android.R.attr enthalten, während die Attribute für dieses Projekt in R sind. attr.

int attrsWanted[]=new int[]{android.R.attr.text, R.attr.textColor}; 

Bitte beachten Sie, dass Sie nichts in android.R.styleable verwenden sollten, wie in diesem Thread in der Zukunft geändert werden kann. Es ist immer noch in der Dokumentation, alle diese Konstanten an einem Ort zu sehen, ist nützlich.

es in einem Layout-Dateien verwenden wie Layout \ main.xml Fügen Sie die Namespace-Deklaration

xmlns: app = "http://schemas.android.com/apk/res/com.mycompany .projectname "

im obersten XML-Element.

<com.mycompany.projectname.MyCustomView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:background="@android:color/transparent" 
    android:text="Test text" 
    android:textColor="#FFFFFF" 
app:extraInformation="My extra information"; 
/> 

Referenzieren Sie die benutzerdefinierte Ansicht mit dem vollständig qualifizierten Namen.

Android Labelview Probe

Wenn Sie ein komplettes Beispiel wollen, Blick auf die Android-Label Beispiel zeigen.

LabelView.java

TypedArray a=context.obtainStyledAttributes(attrs, R.styleable.LabelView); 
CharSequences=a.getString(R.styleable.LabelView_text); 
attrs.xml 

<declare-styleable name="LabelView"> 
    <attr name="text"format="string"/> 
    <attr name="textColor"format="color"/> 
    <attr name="textSize"format="dimension"/> 
</declare-styleable> 

custom_view_1.xml

<com.example.android.apis.view.LabelView 
    android:background="@drawable/blue" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    app:text="Blue"app:textSize="20dp"/> 

Dieses in einem Linearlayout mit einem Namespace-Attribut enthalten ist:

xmlns: app = "http: // schemas.android.com/apk/res/com.example.android.apis "

Verwandte Themen