2013년 6월 2일 일요일

[안드로이드App] '퍼즐앤드래곤 백업관리자' 사용메뉴얼 - 2. 리셋 및 튜토리얼 스킵

알려드립니다.

현재 구글플레이에서 해당 앱이 삭제되었습니다.

이유는 저작권 관련 문제라고 하는데요.

다른 유사앱들이 정상적인걸로 보아 누군가 저작권을 핑계로 신고를 한것 같네요.

사용중이신 분들께는 죄송하지만 이에 대해 이의제기할 생각이 없구요.

제가 작년부터 시간이 없어서 앱을 관리할 짬이 안나네요.

취미로 시작해서 만든 앱이지만 끝까지 책임지지 못한것에 대해 죄송하게 생각합니다.

못난 앱 사용해주셔서 감사드리며 앞으로도 즐퍼드하세요 ㅋㅋ

[안드로이드App] '퍼즐앤드래곤 백업관리자' 사용메뉴얼 - 1. 계정 생성 및 관리

알려드립니다.

현재 구글플레이에서 해당 앱이 삭제되었습니다.

이유는 저작권 관련 문제라고 하는데요.

다른 유사앱들이 정상적인걸로 보아 누군가 저작권을 핑계로 신고를 한것 같네요.

사용중이신 분들께는 죄송하지만 이에 대해 이의제기할 생각이 없구요.

제가 작년부터 시간이 없어서 앱을 관리할 짬이 안나네요.

취미로 시작해서 만든 앱이지만 끝까지 책임지지 못한것에 대해 죄송하게 생각합니다.

못난 앱 사용해주셔서 감사드리며 앞으로도 즐퍼드하세요 ㅋㅋ

2013년 5월 26일 일요일

[Android] AsyncTask를 이용한 ProgressDialog 사용 예제

ProgressDialog 를 띄워서 현재 진행중인 작업의 진행률을 표시해보자.

싱글쓰레드를 사용하면 UI 갱신이 안되서 멀티쓰레드를 써야하는데

Thread를 직접 생성해서 사용할 수 있지만

AsyncTask 라는 쓰기 좋은 녀석이 있다는 사실.

아래는 공식 레퍼런스

http://developer.android.com/intl/ko/reference/android/os/AsyncTask.html

http://developer.android.com/intl/ko/reference/android/app/ProgressDialog.html


이번 예제는 버튼을 누르면 AsyncTask를 사용하여

ProgressDialog를 띄우고 진행 중인 작업 정보를 갱신해주면서

작업 종료시에 Dialog 닫고 Toast 메시지 하나 띄우는 예제임.

 
 

ProgressDlgTest.java
import android.app.ProgressDialog;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.Toast;

public class ProgressDlgTest extends AsyncTask< Integer//excute()실행시 넘겨줄 데이터타입
            , String//진행정보 데이터 타입 publishProgress(), onProgressUpdate()의 인수 
            , Integer//doInBackground() 종료시 리턴될 데이터 타입 onPostExecute()의 인수
> {
 //ProgressDialog를 멤버로 하나 넣어줌
 private ProgressDialog mDlg;
 private Context mContext;
 
 public ProgressDlgTest(Context context) {
  mContext = context;
 }
 
 //onPreExecute 함수는 이름대로 excute()로 실행 시 doInBackground() 실행 전에 호출되는 함수
 //여기서 ProgressDialog 생성 및 기본 세팅하고 show()
 @Override
 protected void onPreExecute() {
  mDlg = new ProgressDialog(mContext);
  mDlg.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
  mDlg.setMessage("작업 시작");
  mDlg.show();
        
        super.onPreExecute();
    }

 //doInBackground 함수는 excute() 실행시  실행됨
 //여기서 인수로는 작업개수를 넘겨주었다.
 @Override
 protected Integer doInBackground(Integer... params) {
  
  final int taskCnt = params[0];
  //넘겨받은 작업개수를 ProgressDialog의 맥스값으로 세팅하기 위해 publishProgress()로 데이터를 넘겨준다.
  //publishProgress()로 넘기면 onProgressUpdate()함수가 실행된다.
  publishProgress("max", Integer.toString(taskCnt));
  
  //작업 진행, 여기선 넘겨준 작업개수 * 100 만큼 sleep() 걸어줌
  for (int i = 0; i < taskCnt; ++i) {
   try {
    Thread.sleep(100);
   } catch (InterruptedException e) {
    e.printStackTrace();
   }
   //작업 진행 마다 진행률을 갱신하기 위해 진행된 개수와 설명을 publishProgress() 로 넘겨줌.
   publishProgress("progress", Integer.toString(i), "작업 번호 " + Integer.toString(i) + "번 수행중");
  }
  
  //작업이 끝나고 작업된 개수를 리턴 . onPostExecute()함수의 인수가 됨
  return taskCnt;
 }
 
 //onProgressUpdate() 함수는 publishProgress() 함수로 넘겨준 데이터들을 받아옴
 @Override
    protected void onProgressUpdate(String... progress) {
  if (progress[0].equals("progress")) {
   mDlg.setProgress(Integer.parseInt(progress[1]));
   mDlg.setMessage(progress[2]);
  }
  else if (progress[0].equals("max")) {
   mDlg.setMax(Integer.parseInt(progress[1]));
  }
    }
 
 //onPostExecute() 함수는 doInBackground() 함수가 종료되면 실행됨
  @Override
     protected void onPostExecute(Integer result) {
   mDlg.dismiss();
   Toast.makeText(mContext, Integer.toString(result)+ "개의 작업 완료", Toast.LENGTH_SHORT).show();
 }
}


Main.java
public class Main extends Activity {
    /** Called when the activity is first created. */
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        Button btn = (Button) findViewById(R.id.btn_popup);
        btn.setOnClickListener(new Button.OnClickListener() {
         public void onClick(View v) {
          //ProgressDlgTest 실행
          new ProgressDlgTest(Main.this).execute(100);
         }
        });
    }
}

AsyncTask 사용하면서 삽질을 좀 했는데

주의할 점이 많으니 사용 전 꼭 공식레퍼런스를 읽어보기.

첨엔 뭣 모르고 doInBackground() 함수내에서 ListView 갱신을 했더니 프로그램이 그냥 죽더라.

한참 헤매다가 AsyncTask 구조를 좀 이해하고 해결;;

결론은 UI 갱신은 publishProgress()를 사용해서 onProgressUpdate()콜백에서 처리해야 됨

암튼 직접 Thread 생성해서 작업하는거 보다 좋음




2013년 5월 23일 목요일

[Android] PopupWindow 사용 예제

팝업 윈도우를 사용해보자.

아래는 공식 레퍼런스

아래 처럼 버튼 클릭시 버튼 3개로 구성된 팝업윈도우를 띄워보자.


java 코드
public class Main extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        //팝업을 띄우기 위하 버튼 하나 만들고
        Button btn = (Button) findViewById(R.id.btn_popup);
        btn.setOnClickListener(new Button.OnClickListener() {
         public void onClick(View v) {
          
          //클릭시 팝업 윈도우 생성
          PopupWindow popup = new PopupWindow(v);
                LayoutInflater inflater = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
          //팝업으로 띄울 커스텀뷰를 설정하고
          View view = inflater.inflate(R.layout.test_popup_window, null);
          popup.setContentView(view); 
          //팝업의 크기 설정
          popup.setWindowLayoutMode(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT);
          //팝업 뷰 터치 되도록
          popup.setTouchable(true);
          //팝업 뷰 포커스도 주고
          popup.setFocusable(true);
          //팝업 뷰 이외에도 터치되게 (터치시 팝업 닫기 위한 코드)
          popup.setOutsideTouchable(true);
          popup.setBackgroundDrawable(new BitmapDrawable());
          //인자로 넘겨준 v 아래로 보여주기
          popup.showAsDropDown(v);
         }
        });
    }
}


test_popup_window.xml


    

xml 코드가 이상하게 붙네;;

암튼 이런식으로 커스텀 팝업윈도우를 쓸 수 있다.

2013년 5월 22일 수요일

[Android] 안드로이드 기본 제공 이미지 경로

sdk 설치 경로

..\sdk\platforms\android-버전번호\data\res\

아래 각 drawble 폴더에서 확인 가능


2013년 5월 21일 화요일

[App제작] 퍼즐앤드래곤 백업 유틸 제작

요즘 즐기고 있는 모바일 게임 퍼즐앤드래곤

 

루팅폰을 사용하면서 계정 2개를 번갈아 플레이 하고 있는데

계정 변경할때 root explorer 어플로

계정 데이터를 복사해야 하는데 이게 은근히 귀찮다.

기존에 백업 유틸이 있긴한데

그건 다수 계정을 사용하려면 프리미엄 기능을 구입해야 하더라

그래서 만들었다.

계정 변경 어플;;;




공부겸 취미겸 만들었는데

안드로이드 개발을 처음 해보는거라 생각보다 시간이 걸린듯

일단 루팅폰만 사용가능하고 기능은 다음과 같다.

1. 백업 기능
2. 리셋 기능
3. 다수 계정 변경 기능


확실히 만들어 쓰니깐 편하긴 편함.

터치 2번이면 계정변경이 되니 만든 보람은 있네;;



이제 마무리 작업이랑 UI 좀 입히는 작업만 하면 될듯.

이번 주말에 작업 좀 하면 배포가능한 버전은 나올듯




[Android] Boradless 버튼 만들기

버튼을 생성하고 이미지를 안 입히면





















'새 계정 생성' 버튼 처럼 board 가 형성된다.

허나 이 board를 아래 그림 처럼 없애고 싶을때는


아래 속성을 넣어보자
android:background="?android:attr/selectableItemBackground"

그러면 아래 그림처럼 boardless 버튼이 완성