춤추는 개발자

[Android Studio] 영어단어 앱 만들기 - 세부 기능 본문

Android/study_til

[Android Studio] 영어단어 앱 만들기 - 세부 기능

Heon_9u 2020. 12. 13. 18:02
728x90
반응형

스마트폰 기기의 버튼을 구성하는 메소드로 이를 Overriding해서 활용.

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    menu.add(0, 1, 0, "sound on");
    menu.add(0, 2, 0, "sound off");
    menu.add(0, 3, 0, "");
    menu.add(0, 4, 0, "");
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch(item.getItemId()) {
        case 1:
            StudyView.soundOk = 1;
            break;
        case 2:
            StudyView.soundOk = 0;
            break;
        default:
            break;
    }
    return true;
}

@Override
public boolean onKeyDown(int keyCode, KeyEvent event) {
    if(keyCode == event.KEYCODE_BACK) {
        finish();
        return false;
    }

    return false;
}

 

1. onCreateOptionsMenu(Menu menu)

 기기의 menu 키를 눌렀을 때, 보통 아래에서 위로 올라오는 메뉴이다. 여기서는 sound on/off 용으로 활용했지만, add(Group Id, Item Id, 배치순서, 메뉴타이틀) 메소드를 이용해서 메뉴를 추가할 수 있다.

 

2. onOptionsItemSelected(MenuItem item)

 Option Menu의 MenuItem 중 하나를 눌렀을 때 자동으로 호출되는 메소드이다. onCreateOptionsMenu메소드에서 MenuItem을 "sound on", "sound off" 2개를 만들었다. 여기서 soundOk는 StudyView 메소드의 static 변수다.

 

3. onKeyDown(int keyCode, KeyEvent event)

 사용자가 키를 누르면 onKeyDown 메소드가 호출된다. 매개변수인 event를 통해 키에 대한 정보를 얻을 수가 있다. 해당 예제에서 KeyEvent.KEYCODE_BACK은 돌아가기 키를 눌렀을 때를 의미한다.

 


이미지의 크기와 위치 설정

이미지의 크기를 상대적으로 조절하는 방법
소스 int xWidth = StudyView.Width / 5;
int yWidth = StudyView.Height / 7;
분석 .Width 값은 사용자의 스마트폰 기기의 가로 크기, .Heigth는 세로크기에 해당된다. 이를 통해 이미지 크기를 설정하면 해상도가 다른 기기에서도 이미지크기가 깨지지 않는다.

 


[내노트] 구현하기

 DB를 호출하고 특정 테이블은 cursor에 담아 [내노트]를 화면에 띄웁니다.

if (dicOk == 1) {
  canvas.drawRect(0,0, Width, Height, frame);
  canvas.drawRect(btnNum1.w/2,btnNum1.w/2,Width-btnNum1.w/2,Height-btnNum1.w/2, pp);

  SQLiteDatabase db = m_helper.getReadableDatabase();
  cursor = db.query("englishWordTable", null, null, null, null, null, null);

  int numofdb = cursor.getCount();

  if (movePosition > numofdb) movePosition -= 5;
  else if (movePosition == numofdb) movePosition -= 5;

  if (movePosition <= 0) movePosition = 0;

  for (int i = 0; i < 5; i++) {
      if (cursor.moveToPosition(movePosition + i) == false) break;
      canvas.drawText((movePosition + i + 1) + " " + cursor.getString(1) + " : "
              + cursor.getString(2), btnExit.w * 3, btnExit.h * 4 + btnExit.w * 3 / 2 * i - 50, paint);
      //현재 내노트에 있는 단어 5개 대한 영어단어를 삭제를 위해 wordForDelete[]에담는다.
      wordForDelete[i] = cursor.getString(1);
  }

  //left, right arrow  and close button in circle format
  canvas.drawBitmap(btnLeftArrow.button_img, btnLeftArrow.x, btnLeftArrow.y, null);
  canvas.drawBitmap(btnRightArrow.button_img, btnRightArrow.x, btnRightArrow.y, null);
  canvas.drawBitmap(btnClose.button_img, btnClose.x, btnClose.y, null);

  int x = 0;
  for (int i = 0; i < 5; i++) {
      canvas.drawText("저장된 단어수 : " + Integer.toString(numofdb), 100, 100, paint2);
      imsy = 0;
      if (numofdb == 0) {
          canvas.drawText("단어가 없습니다!", 70, 180 + 90 * i, paint);
          break;
      }

      canvas.drawBitmap(btnForDictionary[i].button_img, btnForDictionary[i].x, btnForDictionary[i].y + btnExit.h / 3 - 50, null);

      x = (numofdb - 1) / 5;
      if ((movePosition) / 5 < x) imsy = 1;
      else imsy = 0;

      if (imsy == 0) {
          if (numofdb % 5 == 4 && i == 3) break;
          if (numofdb % 5 == 3 && i == 2) break;
          if (numofdb % 5 == 2 && i == 1) break;
          if (numofdb % 5 == 1 && i == 0) break;
      }
  }
  
  cursor.close();
  db.close();
}

 

 위 코드에서 .getReadableDatabase()로 읽을 수 있는 DB객체를 실행, .query() 메서드로 원하는 테이블을 cursor에 저장합니다. 그리고 .getCount()로 테이블에 저장된 레코드 갯수를 numofdb에 저장합니다.

 

 첫번째 for문으로 5개씩 레코드를 화면에 띄우고, wordForDelete라는 배열에 저장해서 만약 [삭제]버튼을 누를 경우, Delete할 레코드에 쉽게 접근할 수 있게 만들었습니다.

 두번째 for문으로 저장된 단어 수와 레코드마다 끝에 [삭제]버튼을 drawBitmap으로 띄워줍니다. 이를 터치하면 레코드 삭제를 담당하는 조건문에서 해당 레코드를 DELETE합니다.

 

728x90
반응형