这是学习Android2高级编程上面的一个例子,效果图如下:
public class ToDoList extends Activity {
private EditText mEditText;
private ListView mListView;
private ArrayList<String> mList;
private ArrayAdapter<String> mToDoAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.todolist);
mEditText = (EditText) findViewById(R.id.editText);
mListView = (ListView) findViewById(R.id.listView);
mList = new ArrayList<String>();
int resID = R.layout.todolist_item;
mToDoAdapter = new ArrayAdapter<String>(this, resID, mList);
mListView.setAdapter(mToDoAdapter);
mEditText.setOnKeyListener(editListener);
}
OnKeyListener editListener = new OnKeyListener() {
@Override
public boolean onKey(View v, int keyCode, KeyEvent event) {
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
mList.add(0, mEditText.getText().toString());
mToDoAdapter.notifyDataSetChanged();
mEditText.setText("");
}
}
return false;
}
};
}
public class ToDoListItemView extends EditText{
private Paint mLinePaint;
private Paint mMarginPaint;
private int mPaperColor;
private float mMargin;
public ToDoListItemView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public ToDoListItemView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public ToDoListItemView(Context context) {
super(context);
init();
}
private void init() {
Resources resources=getResources();
mMarginPaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mMarginPaint.setColor(resources.getColor(R.color.notepad_lines));
mLinePaint=new Paint(Paint.ANTI_ALIAS_FLAG);
mLinePaint.setColor(resources.getColor(R.color.notepad_lines));
mPaperColor=resources.getColor(R.color.notepad_paper);
mMargin=resources.getDimension(R.dimen.notepad_margin);
}
@Override
protected void onDraw(Canvas canvas) {
canvas.drawColor(mPaperColor);
//draw line
canvas.drawLine(0, 0, getMeasuredWidth(), 0, mLinePaint);
canvas.drawLine(0, getMeasuredHeight(), getMeasuredWidth(), getMeasuredHeight(), mLinePaint);
//draw margin
canvas.drawLine(mMargin, 0, mMargin, getMeasuredHeight(), mMarginPaint);
canvas.save();
canvas.translate(mMargin, 0);
super.onDraw(canvas);
canvas.restore();
}
}
todolist.xml:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<EditText android:layout_width="fill_parent" android:text="TextView"
android:layout_height="wrap_content" android:id="@+id/editText"></EditText>
<ListView android:layout_height="wrap_content" android:id="@+id/listView"
android:layout_width="fill_parent"></ListView>
</LinearLayout>
todolist_item.xml:
<?xml version="1.0" encoding="utf-8"?>
<com.gao.apidemo.todolist.ToDoListItemView
xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/item_view"
android:layout_width="fill_parent" android:layout_height="fill_parent"
android:padding="10dp" android:scrollbars="vertical" android:textColor="@color/notepad_text"
android:fadingEdge="vertical" />
在处理按键事件时:
if (event.getAction() == KeyEvent.ACTION_DOWN) {
if (keyCode == KeyEvent.KEYCODE_MENU) {
mList.add(0, mEditText.getText().toString());
mToDoAdapter.notifyDataSetChanged();
mEditText.setText("");
}
}
如果不进行这个判断
if (keyCode == KeyEvent.KEYCODE_MENU) {
那么会插入两条记录其中一条是空的记录,这是因为action会有KeyEvent.ACTION_DOWN和KeyEvent.ACTION_UP两个事件
canvas.save();
canvas.translate(mMargin, 0);
super.onDraw(canvas);
canvas.restore();
这个是先将坐标沿着x轴偏移mMargin距离,然后调用系统的super.onDraw(canvas)画出文本,然后恢复坐标