现在的位置: 首页 > 综合 > 正文

todolist自定义界面

2013年06月10日 ⁄ 综合 ⁄ 共 3401字 ⁄ 字号 评论关闭

这是学习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)画出文本,然后恢复坐标

抱歉!评论已关闭.