И так, давайте продолжаем то что начали, наш To Do List. В этом примере мы изменим стандартные цвета, научимся добавлять и уничтожать наши заметки, сохранять их при выходе из приложения (не добавлять их в базу данных, это в следующем уроке).
размером 16 на 16 пикселлей, добавляем в каталог res/drawable-hdpi с именами add.png, remove.png (добавлю к конце статьи для скачки). Дальше редактируем наш string.xml , добавляем нужные строки:
<string name="add_item">Add To Do</string>
<string name="remove_item">Remove</string><string name="cancel">Cancel</string>
Создаем новую тему для нашего приложения, файл styles.xml res/value
<?xml version="1.0" encoding="utf-8"?>
<resources><style name="ToDoTheme" parent="@android:style/Theme.Black"><item name="android:textSize">12sp</item></style></resources>
В файле манефесте нам нужно объявить ее, для этого приписываем
<activity
android:label="@string/app_name"
android:theme="@style/ToDoTheme"
android:name=".ToDoListActivity" >
Создаем еще один файл для использования наших расцветок, colors.xml в res/value
<?xml version="1.0" encoding="utf-8"?>и так же файл размеров шрифта dimens.xml в том же каталоге
<resources>
<color name="notepad_paper">#AAFFFF99</color>
<color name="notepad_lines">#FF0000FF</color>
<color name="notepad_margin">#90FF0000</color>
<color name="notepad_text">#AA0000FF</color>
</resources>
<?xml version="1.0" encoding="utf-8"?>Вроде с xml покончили! Далее создаем класс ToDoListItemView унаследованный от класса TextView, будем изменять TextView как нам нужно
<resources>
<dimen name="notepad_margin">30dp</dimen>
</resources>
private Paint marginPaint;Это будут наши переменные в которые мы добавим заданные нами цвета с файла ресурсов colors.xml
private Paint linePaint;
private int paperColor;
private float margin;
public ToDoListItemView (Context context, AttributeSet ats, int ds) {Создаем три конструктора, в них мы вызываем метод init() он ответственный за заполнения переменных ресурсами
super(context, ats, ds);
init();
}
public ToDoListItemView (Context context) {
super(context);
init();
}
public ToDoListItemView (Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
Следущий метод который нам нужно создать в этом классе это само рисование, будем рисовать с помощью Canvas:
private void init() {
// Get a reference to our resource table.
Resources myResources = getResources();
// Create the paint brushes we will use in the onDraw method.
marginPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
marginPaint.setColor(myResources.getColor(R.color.notepad_margin));
linePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
linePaint.setColor(myResources.getColor(R.color.notepad_lines));
// Get the paper background color and the margin width.
paperColor = myResources.getColor(R.color.notepad_paper);
margin = myResources.getDimension(R.dimen.notepad_margin);
}
@Overrideс этим классом закончино, теперь мы переходим в наш класс активити ToDoListActivity. Здесь мы должны создать меню и соответственно то что должно выполнять меню.
public void onDraw(Canvas canvas) {
// Color as paper
canvas.drawColor(paperColor);
// Draw ruled lines
canvas.drawLine(0, 0, getMeasuredHeight(), 0, linePaint);
canvas.drawLine(0, getMeasuredHeight(),
getMeasuredWidth(), getMeasuredHeight(),
linePaint);
// Draw margin
canvas.drawLine(margin, 0, margin, getMeasuredHeight(), marginPaint);
// Move the text across from the margin
canvas.save();
canvas.translate(margin, 0);
// Use the TextView to render the text.
super.onDraw(canvas);
canvas.restore();
}
static final private int ADD_NEW_TODO = Menu.FIRST;Добольяем статические переменные для нашего меню и выносом заданые нами уже переменые в класс, для того что бы другие методы могли ими пользоватся.
static final private int REMOVE_TODO = Menu.FIRST + 1;
private boolean addingNew = false;
private ArrayList<String> todoItems;
private ListView myListView;
private EditText myEditText;
private ArrayAdapter<String> aa;
@Override
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
// Create and add new menu items.
MenuItem itemAdd = menu.add(0, ADD_NEW_TODO, Menu.NONE,
R.string.add_new);
MenuItem itemRem = menu.add(0, REMOVE_TODO, Menu.NONE,
R.string.remove);
// Assign icons
itemAdd.setIcon(R.drawable.add);
itemRem.setIcon(R.drawable.remove);
// Allocate shortcuts to each of them.
itemAdd.setShortcut('0', 'a');
itemRem.setShortcut('1', 'r');
return true;
}
@OverrideДанный метод служит для создания меню и в нашем случае мы добавляем иконки к пунтктам меню. Для меню не нужно создавать размеры, андроид делает разметку автоматом, если пунктов меню больше чем 6 то он переносит их в допольнительное меню, добовлая пункт "Еще".
public void onCreateContextMenu(ContextMenu menu,
View v,
ContextMenu.ContextMenuInfo menuInfo) {
super.onCreateContextMenu(menu, v, menuInfo);
menu.setHeaderTitle("Selected To Do Item");
menu.add(0, REMOVE_TODO, Menu.NONE, R.string.remove);
}
@OverrideОбработчик событий меню.
public boolean onOptionsItemSelected(MenuItem item) {
super.onOptionsItemSelected(item);
int index = myListView.getSelectedItemPosition();
switch (item.getItemId()) {
case (REMOVE_TODO): {
if (addingNew) {
cancelAdd();
}
else {
removeItem(index);
}
return true;
}
case (ADD_NEW_TODO): {
addNewItem();
return true;
}
}
return false;
}
private void cancelAdd() {Методы отвечающие за добовление или унижтожение заметки.
addingNew = false;
myEditText.setVisibility(View.GONE);
}
private void addNewItem() {
addingNew = true;
myEditText.setVisibility(View.VISIBLE);
myEditText.requestFocus();
}
private void removeItem(int _index) {
todoItems.remove(_index);
aa.notifyDataSetChanged();
}
Вот и все вроде! Урок получился большой, много кода, поэтому на всякий случай выкладываю ниже свои коды. Спасибо!!!
Коды (и add.png, remove.png)
Комментариев нет:
Отправить комментарий