среда, 8 февраля 2012 г.

Приложение To Do (часть 2)

И так, давайте продолжаем то что начали, наш To Do List. В этом примере мы изменим стандартные цвета, научимся добавлять и уничтожать наши заметки, сохранять их при выходе из приложения (не добавлять их в базу данных, это в следующем уроке).
Нужно создать два png файла для меню добавить и удалить, я создал вот такие:
размером 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"?>
<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>
и так же файл размеров шрифта dimens.xml в том же каталоге
<?xml version="1.0" encoding="utf-8"?>
<resources>
    <dimen name="notepad_margin">30dp</dimen>
</resources>
Вроде с xml покончили! Далее создаем класс ToDoListItemView унаследованный от класса TextView, будем изменять TextView как нам нужно
  private Paint marginPaint;
  private Paint linePaint;
  private int paperColor;
  private float margin;
Это будут наши переменные в которые мы добавим заданные нами цвета с файла ресурсов colors.xml
public ToDoListItemView (Context context, AttributeSet ats, int ds) {
    super(context, ats, ds);
    init();
  }

  public ToDoListItemView (Context context) {
    super(context);
    init();
  }

  public ToDoListItemView (Context context, AttributeSet attrs) {
    super(context, attrs);
    init();
  }
Создаем три конструктора, в них мы вызываем метод init() он ответственный за заполнения переменных ресурсами

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);
  }
Следущий метод который нам нужно создать в этом классе это само рисование, будем рисовать с помощью Canvas:
@Override
  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();
  }
с этим классом закончино, теперь мы переходим в наш класс активити ToDoListActivity. Здесь мы должны создать меню и соответственно то что должно выполнять меню.
  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
  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);
  }
 Данный метод служит для создания меню и в нашем случае мы добавляем иконки к пунтктам меню. Для меню не нужно создавать размеры, андроид делает разметку автоматом, если пунктов меню больше чем 6 то он переносит их в допольнительное меню, добовлая пункт "Еще".
@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)

Комментариев нет:

Отправить комментарий