Wie eine einfache benutzerdefinierte Ansicht erstellen?
-
09-10-2019 - |
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>
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"