Es ist üblich, ein Klicküberwachungs--Ereignis für eine Ansicht einzurichten, z. B.
view.setOnClickListener(onClickListener);
. Eine andere Möglichkeit besteht darin, es direkt im XML< anzugeben 🎜>-Layout Für die Rückrufmethode beim Klicken auf die Ansicht müssen Sie zunächst die Rückrufmethode in die Aktivität schreiben, z. B.
public void onClickView(View view){ // do something }
android:onClick
der Ansicht festlegen in XML
<View android:layout_width="match_parent" android:layout_height="match_parent" android:onClick="onClickView" />
View verfügt über 5
Konstruktionsmethoden . Die erste wird intern verwendet. Die zweite Methode wird normalerweise verwendet, um View-Instanzen direkt zu erstellen Aus dem XML-Layout wird schließlich die fünfte Methode aufgerufen.
public View(Context context, @Nullable AttributeSet attrs, int defStyleAttr, int defStyleRes) { this(context); final TypedArray a = context.obtainStyledAttributes( attrs, com.android.internal.R.styleable.View, defStyleAttr, defStyleRes); for (int i = 0; i < N; i++) { int attr = a.getIndex(i); switch (attr) { …… // 处理onClick属性 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) { // 给当前View实例设置一个DeclaredOnClickListener监听器 setOnClickListener(new DeclaredOnClickListener(this, handlerName)); } break; } } }
/** * Indicates whether this Context is restricted. * * @return {@code true} if this Context is restricted, {@code false} otherwise. * * @see #CONTEXT_RESTRICTED */ public boolean isRestricted() { return false; }
-Attribut, das wir betrachten, werden ebenfalls ignoriert. android:onClick
Ein eingeschränkter Kontext kann bestimmte Funktionen deaktivieren. Beispielsweise würde eine mit einem eingeschränkten Kontext verknüpfte Ansicht bestimmte XML-Attribute ignorieren.Die isRestricted-Methode ist jedoch eine davon die wenigen in Context Es gibt viele konkrete Implementierungsmethoden (der Rest sind im Grunde abstrakte Methoden), hier wird direkt false zurückgegeben, und diese Methode wird nur in ContextWrapper und MockContext
public class ContextWrapper extends Context { Context mBase; @Override public boolean isRestricted() { return mBase.isRestricted(); } } public class MockContext extends Context { @Override public boolean isRestricted() { throw new UnsupportedOperationException(); } }
Unit-Tests verwendet, sodass isRestricted hier grundsätzlich nur false zurückgibt, es sei denn, ein benutzerdefinierter ContextWrapper wird verwendet und isRestricted wird neu geschrieben. Kehren Sie zur Ansicht zurück und
ruft dann tatsächlich die final String handlerName = a.getString(attr);
Zeichenfolge android:onClick="onClickView"
von „onClickView“ in ab und verwendet dann die Instanz der aktuellen Ansicht und „onClickView“, um eine DeclaredOnClickListener-Instanz zu erstellen. und als Klick-Listener der aktuellen Ansicht festlegen.
/** * An implementation of OnClickListener that attempts to lazily load a * named click handling method from a parent or ancestor context. */ private static class DeclaredOnClickListener implements OnClickListener { private final View mHostView; private final String mMethodName; private Method mMethod; public DeclaredOnClickListener(@NonNull View hostView, @NonNull String methodName) { mHostView = hostView; mMethodName = methodName; } @Override public void onClick(@NonNull View v) { if (mMethod == null) { mMethod = resolveMethod(mHostView.getContext(), mMethodName); } try { mMethod.invoke(mHostView.getContext(), v); } catch (IllegalAccessException e) { throw new IllegalStateException( "Could not execute non-public method for android:onClick", e); } catch (InvocationTargetException e) { throw new IllegalStateException( "Could not execute method for android:onClick", e); } } @NonNull private Method resolveMethod(@Nullable Context context, @NonNull String name) { while (context != null) { try { if (!context.isRestricted()) { return context.getClass().getMethod(mMethodName, View.class); } } catch (NoSuchMethodException e) { // Failed to find method, keep searching up the hierarchy. } if (context instanceof ContextWrapper) { context = ((ContextWrapper) context).getBaseContext(); } else { // Can't search up the hierarchy, null out and fail. context = null; } } final int id = mHostView.getId(); final String idText = id == NO_ID ? "" : " with id '" + mHostView.getContext().getResources().getResourceEntryName(id) + "'"; throw new IllegalStateException("Could not find method " + mMethodName + "(View) in a parent or ancestor Context for android:onClick " + "attribute defined on view " + mHostView.getClass() + idText); } }
darin besteht, die Rückrufmethode aus dem Kontext zu finden, also wenn Sie eine Ansicht im XML erstellen Für das Fragment können Sie diese Methode nicht verwenden, um die Rückrufmethode in Fragment zu binden, da Fragment selbst kein Kontext ist. Der Kontext der Ansicht ist hier tatsächlich FragmentActivity, was auch bedeutet, dass diese Methode schnell von Fragment zu FragmentActivity zurückrufen kann. android:onClick
auch aus den Kommentaren der DeclaredOnClickListener-Klasse ersichtlich. android:onClick
spielt hauptsächlich die Rolle des verzögerten Ladens . Nur wenn Sie auf „Ansicht“ klicken wird wissen, welche Methode für den Click-Callback verwendet wird.
zum Festlegen eines Klickereignisses für View das Hinzufügen einer öffentlichen Methode ohne Schnittstelle zur Aktivität bedeutet. Der aktuelle Android-Entwicklungstrend lautet: „Schreiben Sie keine Geschäftslogik in die Aktivitätsklasse.“ Dies ist vorteilhaft für die Projektwartung und verhindert eine Aktivitätsexplosion. Versuchen Sie daher, in der Aktivität keine öffentlichen Methoden zu verwenden, die keine Schnittstelle und keinen Lebenszyklus betreffen. Daher kann die voreilige Verwendung von android:onClick
die Aktivität „verunreinigen“. android:onClick
Das obige ist der detaillierte Inhalt vonFallfreigabe zum Festlegen von Klickereignissen für die Ansicht im XML-Layout. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!