我正在创建一个包含标签和按钮的自定义按钮组件。在attrs.xml中定义后,我可以使用XAML设置displaytext和其他属性(比如
)<UButton displayText="Hello" ... />
)。但是我需要允许用户通过在XAML中定义它来处理此控件的Click事件,如
mclick="button_click"
。但我无法找到处理此问题的文件。你能指导我吗?
答案 0 :(得分:0)
让我们看一下Button
的源代码。
在此link(Android attrs.xml
源代码)中,搜索onClick
,您会发现:
<!-- Name of the method in this View's context to invoke when the view is
clicked. This name must correspond to a public method that takes
exactly one parameter of type View. For instance, if you specify
<code>android:onClick="sayHello"</code>, you must declare a
<code>public void sayHello(View v)</code> method of your context
(typically, your Activity). -->
<attr name="onClick" format="string" />
这就是你使用时的原因:
<Button
android:layout_width="match_parent"
android:layout_height="match_parent"
android:onClick="onClick"/>
它会找到onClick
方法。
Here,您会看到Android如何处理android:onClick="onClick"
,View(Context context, AttributeSet attrs, int defStyleAttr)
方法,android:onClick="onClick"
对应R.styleable.View_onClick
:< / p>
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 OnClickListener() {
private Method mHandler;
public void onClick(View v) {
if (mHandler == null) {
try {
mHandler = getContext().getClass().getMethod(handlerName,
View.class);
} catch (NoSuchMethodException e) {
int id = getId();
String idText = id == NO_ID ? "" : " with id '"
+ getContext().getResources().getResourceEntryName(
id) + "'";
throw new IllegalStateException("Could not find a method " +
handlerName + "(View) in the activity "
+ getContext().getClass() + " for onClick handler"
+ " on view " + View.this.getClass() + idText, e);
}
}
try {
mHandler.invoke(getContext(), View.this);
} catch (IllegalAccessException e) {
throw new IllegalStateException("Could not execute non "
+ "public method of the activity", e);
} catch (InvocationTargetException e) {
throw new IllegalStateException("Could not execute "
+ "method of the activity", e);
}
}
});
}
break;
你会发现,它通过反思找到了方法。
所以,我猜你忘了处理mclick="button_click"
了。通常,我们不会使用它来添加点击监听器,这有点复杂。我们使用View
&#39; s setOnClickListener。