Frage

Ich möchte eine benutzerdefinierte View auf Android erstellen. Ich habe versucht, es so einfach wie möglich zu tun und eine fast leere Klasse MyView erstellt und verwende es in meinem LinearLayout aber die Anwendung nicht beim Start mit „Force Close“. Wie kann ich ein einfaches benutzerdefiniertes View tun? Nach Erstellen benutzerdefinierter Komponenten die View die Größe bekommt 100x100 wenn ich weiß nicht außer Kraft setzen onMeasure().

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, dass itemon vorschlagen und der entsprechende Aufruf der übergeordneten Klasse. Dann ist die „Force Close“ gegangen, aber mein LinearLayout gebrochen wird, werden die Komponenten nach MyView nicht gezeigt.

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>
War es hilfreich?

Lösung

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

public MyView(Context context, AttributeSet attrs)

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

Andere Tipps

Der Android Developer Guide hat einen Abschnitt namens Erstellen benutzerdefinierte Komponenten. Leider schreibt die Diskussion von XML nur deckt die Steuerung innerhalb der Layout-Datei deklariert und nicht die Werte tatsächlich innerhalb der Klasse der Initialisierung der Handhabung. Die Schritte sind wie folgt:

Declare Attribute in Werte \ 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>

Beachten Sie die Verwendung eines nicht qualifizierten Namen in der declare-styleable-Tag. Nicht-Standard-Android-Attribute wie extraInformation Notwendigkeit, ihren Typ deklariert haben. Tags in der übergeordneten Klasse deklariert werden in Unterklassen zur Verfügung stehen, ohne neu deklariert werden müssen.

Erstellen Konstrukteurs

Da es zwei Konstruktoren, die eine AttributeSet zur Initialisierung verwenden, ist es zweckmäßig, eine separate Initialisierungsmethode für die Konstrukteurs-Aufruf zu erstellen.

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 wobei jedes Element die ID eines Attributs. Attribute werden für jede Eigenschaft im XML erzeugt durch die Attributnamen auf den Elementnamen angehängt wird. Attribute können dann aus dem TypedArray abgerufen werden unter Verwendung verschiedener get-Funktionen. Wenn das Attribut nicht in der XML definiert ist, wird null zurückgegeben. Außer natürlich, wenn der Rückgabetyp ein primitiver ist, wobei in diesem Fall das zweite Argument zurückgeführt wird.

Wenn Sie nicht wollen, alle Attribute abzurufen, ist es möglich, dieses Array manually.The ID für Standard-Android-Attribute zu erstellen sind in android.R.attr enthalten, während Attribute für dieses Projekt sind in R.attr .

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

Bitte beachten Sie, dass Sie nichts in android.R.styleable, gemäß diesem Thread verwenden sollten es in Zukunft ändern kann. Es ist immer noch in der Dokumentation als all diese Konstanten in dem einem Ort zu betrachten, nützlich ist.

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

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

in dem obersten Ebene XML-Elemente.

<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";
/> 

Referenz der benutzerdefinierte Ansicht der vollständig qualifizierten Namen verwenden.

Android LABELVIEW Beispiel

Wenn Sie ein vollständiges Beispiel, Blick auf dem Android-Label Beispiel zeigen wollen.

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"/>

Dies ist in einem Linearlayout mit einem Namespace-Attribute enthalten:

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top