2016-04-12 4 views
0

Wie akzeptiert man Methoden als Werte, in Attributen? Wie im onClick für eine Ansicht Attribut:Android: <declare-styleable> Methodenattribute

<Button android:onClick="onClickMethod"/> 

Wie benutzerdefinierte Attribute definieren, die Methoden akzeptieren?

Ich weiß, wir verwenden <declare-styleable> in Ressourcen, aber wie machen wir es akzeptieren Methoden?

Antwort

2

Android verwendet Reflektion, um den Namen der Methode zu finden und sie aufzurufen. Sie können an der Startlinie 4209 https://github.com/android/platform_frameworks_base/blob/master/core%2Fjava%2Fandroid%2Fview%2FView.java#L4209

   case R.styleable.View_onClick: 
       if (context.isRestricted()) { 
        throw new IllegalStateException("The android:onClick attribute cannot " 
          + "be used within a restricted context"); 
       } 

       final String handlerName = a.getString(attr); 
       if (handlerName != null) { 
        setOnClickListener(new DeclaredOnClickListener(this, handlerName)); 
       } 
       break; 

ein Beispiel in der Quelle sehen Wenn der Methodenname nicht null ist, schafft eine neue DeclareOnClickListener() Klasse und initialisiert sie mit dem Methodennamen.

Die DeclareOnClickListener() Klasse wird in Zeile 4435 definiert https://github.com/android/platform_frameworks_base/blob/master/core%2Fjava%2Fandroid%2Fview%2FView.java#L4435

+0

ich sehe. Aber was ist das Format von Android: onClick? Wenn ich versuche, das Referenzformat für meinen Attr zu verwenden, beklagt sich der Ide, dass das Symbol nicht aufgelöst werden kann: 'app: myOnClick =" onClickMethod "' – Alterecho

+1

Ihre Deklaration von 'myOnClick' sollte wie folgt aussehen: '. Sie verwenden eine Zeichenkette, da diese verwendet wird, um den Methodennamen nachzuschlagen. –

+0

Es funktioniert! Aber wie vervollständigen sie die Methode für onClick? – Alterecho