修改现有的View
工具箱包含许多普通需求的UI,但这些控件不一定通用。通过定制这些基本的View,你可以避免重新实现现有的逻辑,而做到为应用程序裁剪它需要的UI和功能。
基于现有的控件来创建新的widget,需要创建一个新类来扩展它。如下面的代码片段所示,对TextView进行了扩展:
import android.content.Context;
import android.util.AttributeSet;
import android.widget.TextView;
public class MyTextView extends TextView {
public MyTextView (Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);
}
public MyTextView (Context context) {
super(context);
}
public MyTextView (Context context, AttributeSet attrs) {
super(context, attrs);
}
}
重写新的View的外观或行为,重写和扩展与想要改变的行为有关的事件处理器。
在接下来的代码片段,onDraw方法被重写来修改View的外观,onKeyDown处理器被重写来允许特定的按键响应:
public class MyTextView extends TextView {
public MyTextView (Context context, AttributeSet ats, int defStyle) {
super(context, ats, defStyle);
}
public MyTextView (Context context) {
super(context);
}
public MyTextView (Context context, AttributeSet attrs) {
super(context, attrs);
}
@Override
public void onDraw(Canvas canvas) {
[ ... 在文字之下画布之上画画... ]
// 使用TextView基类来渲染文字。
super.onDraw(canvas);
[ ... 在文字之上画布之上画画... ]
}
@Override
public boolean onKeyDown(int keyCode, KeyEvent keyEvent) {
[ ... 执行一些特殊的处理 ... ]
[ ... 基于特定的按键按下 ... ]
// 使用现有的功能,通过基类的实现来响应按键按下事件。
return super.onKeyDown(keyCode, keyEvent);
}
}
View中的UI事件处理器将在本章稍后部分详细介绍。