Android Benutzerdefinierte Ansicht Constructor
-
04-10-2019 - |
Frage
Ich lerne über benutzerdefinierte Ansichten aus der folgenden mit:
http://developer.android.com/guide/ Themen / ui / custom-components.html # modifizierende
Die Beschreibung sagt:
Initialisierung von Klassen Wie immer die Super wird zuerst genannt. Außerdem, dies ist kein Standard-Konstruktor, aber eine parametrisierte ein. Die EditText ist mit diesen Parametern erstellt, wenn es wird aus einer XML-Layout-Datei aufgeblasen, damit unser Konstruktor muss sowohl nehmen sie und leiten sie an die Oberklassenkonstruktors auch.
Gibt es eine bessere Beschreibung? Ich habe versucht, herauszufinden, was der Konstruktor (en) sollte wie folgt aussehen und ich habe kommen mit 4 möglichen Entscheidungen (siehe Beispiel am Ende der Post). Ich bin nicht sicher, was diese 4 Möglichkeiten tun (oder nicht tun), warum ich umsetzen soll sie, oder, was die Parameter bedeuten. Gibt es eine Beschreibung von diesen?
public MyCustomView()
{
super();
}
public MyCustomView(Context context)
{
super(context);
}
public MyCustomView(Context context, AttributeSet attrs)
{
super(context, attrs);
}
public MyCustomView(Context context, AttributeSet attrs, Map params)
{
super(context, attrs, params);
}
Lösung
Sie brauchen nicht die erste, da diese einfach nicht funktionieren.
Die dritte wird bedeuten, dass Ihr benutzerdefinierter View
von XML-Layout-Dateien nutzbar sein wird. Wenn Sie nicht über das egal, Sie brauchen es nicht.
Der vierte ist einfach falsch, AFAIK. Es gibt keinen View
Konstruktor, der ein Map
als dritten Parameter übernehmen. Es ist eine, die ein int
als dritter Parameter übernimmt, verwendet, um den Standardstil für das Widget außer Kraft setzen.
Ich neige dazu, die this()
Syntax verwenden diese zu kombinieren:
public ColorMixer(Context context) {
this(context, null);
}
public ColorMixer(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public ColorMixer(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
// real work here
}
Sie können den Rest dieses Codes in dieses Buch Beispiel sehen .
Andere Tipps
Hier ist eine meiner Muster (Erstellen eines benutzerdefinierten ViewGoup
hier, aber immer noch):
// CustomView.java
public class CustomView extends LinearLayout {
public CustomView(Context context) {
super(context);
init(context);
}
public CustomView(Context context, AttributeSet attrs) {
super(context, attrs);
init(context);
}
public CustomView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init(context);
}
private void init(Context ctx) {
LayoutInflater.from(ctx).inflate(R.layout.view_custom, this, true);
// extra init
}
}
und
// view_custom.xml
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<!-- Views -->
</merge>
Wenn Sie das Hinzufügen Ihres benutzerdefinierten View
von xml
wie:
<com.mypack.MyView
...
/>
Sie werden die öffentlichen Konstruktor benötigen MyView(Context context, AttributeSet attrs),
andernfalls erhalten Sie eine Exception
erhalten, wenn Android
versucht Ihre inflate
View
.
Und wenn Sie Ihre View
von xml
hinzufügen und auch Geben Sie die android:style
attribute
wie:
<com.mypack.MyView
style="@styles/MyCustomStyle"
...
/>
Sie müssen auch den dritten öffentlichen Konstruktor MyView(Context context, AttributeSet attrs,int defStyle)
.
Der dritte Konstruktor wird in der Regel verwendet, wenn Sie einen Stil erweitern und anpassen, und dann mögen Sie, dass style
zu einem bestimmten View
in Ihrem Layout setzen
Details bearbeiten
public MyView(Context context, AttributeSet attrs) {
//Called by Android if <com.mypack.MyView/> is in layout xml file without style attribute.
//So we need to call MyView(Context context, AttributeSet attrs, int defStyle)
// with R.attr.customViewStyle. Thus R.attr.customViewStyle is default style for MyView.
this(context, attrs, R.attr.customViewStyle);
}