Приложение 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)

azusdex

Phasellus facilisis convallis metus, ut imperdiet augue auctor nec. Duis at velit id augue lobortis porta. Sed varius, enim accumsan aliquam tincidunt, tortor urna vulputate quam, eget finibus urna est in augue.

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

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