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

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);
    }

Sehen Sie diese

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