2015.07.07 15:52

MAP중에선 HashMap이 가장 효율이 좋지만


안드로이드에선 SparseArray가 더 효율이 좋다고 합니다.


 HashMap<Integer,Integer> map= new HashMap<Integer,Integer>();


예를 들어 다음과 같은 HashMap 코드를 SparseArray로 바꾸려면


 SparseIntArray mapnew SparseIntArray();


이렇게 바꿔주면 끝입니다. 


다만 .remove(i) 가 아니고 .removeAt(i)로 바뀌는 것만 다릅니다.



신고
Posted by 그린블로그 DEV그린
2014.07.22 12:24

SQLiteDatabase는 Sqlite에서 제공하는 쿼리를 편리하게 메소드 형식으로 지원합니다.


db.query(table, columns, selection, selectionArgs, groupBy, having, orderBy)


이런식으로 따로 쿼리문을 전부 칠 필요 없이 해당 테이블값, 컬럼값, 조건문만 맞춰넣어주면 쿼리가 실행되지요.


그런데 이 쿼리 메소드에서 SUM은 불가능 하더군요. 


원래는 selection 부분에 new String[] { SUM(xxx) , xxx,... } 이런식으로 넣어주면 되는데


이상하게 안되더라구요. count는 되면서 sum은 안되는건 무슨 심보냐..!


그래서 결국 rawQuery로 넣고야 말았습니다ㅠ


사실 rawQuery가 쿼리 짜기에는 더 편하긴 하지만 저렇게 값만 딱딱 넣어 주는게 저한텐 더 편했다는 거죠..


지나가는 개발자 분이 이 글을 보신다면 방책좀 알려주세요~ ㅎㅎ

신고
Posted by 그린블로그 DEV그린
2013.11.16 01:02

일반적으로 퍼센트 구하는 공식은 다음과 같습니다.


예 : 1000에서 100은 몇 %인가?

공식 : (일부값 ÷ 전체값) ×100

풀이 : (100 ÷1000) ×100 = 10%


이것을 자바프로그래밍에 도입해봤을 때는 int 값으로 계산하겠죠.


그런데 이렇게 하면 값이 0이 나올 때가 나오고 맙니다.


항상 100 나누기 1000이 아니고 356 나누기 6578 같은 경우도 있으니까요.


그럴 때는 적절하게 double을 써주어야 하는데요~ 이 방법이 가장 좋은 방법 같습니다.


percent = (int)( (double)part/ (double)all * 100.0 );

//percent는 전체값에서 일부값의 퍼센트를 나타낸다. 


신고
Posted by 그린블로그 DEV그린
2013.04.25 23:57




살빼는법2 어플은 


다이어트 팁, 


유저들의 생생한 후기,


실시간 다이어트 뉴스,


미용 몸무게 까지 알려주는 비만도 측정 시스템,


10,000여 가지에 달하는 방대한 음식 DB,


칼로리 기록을 한눈에 알 수 있는


캘린더, 그래프, 일간, 월간, 상세 리포트를 지원합니다!!

또한 다이어터들의 공유의 장인 카톡과 비슷한 SNS 게시판 까지!


당신의 다이어트 성공을 위해 필요한 모든 것을 제공합니다!



이 어플을 무료로 


구글 마켓에서 '살빼는법2' 로 검색하여 다운받으실 수 있습니다!



올해 역시 당신의 훌륭한 다이어트 코치가 될 것을 약속드립니다!





신고
Posted by 그린블로그 DEV그린
2012.01.03 11:30
안드로이드에서 맵뷰를 구현하려면 일단 구글에서 맵키를 부여받아야 합니다.

맵 키는 디버그용(개발용)과 배포용이 있는데 여기서는 디버그용만 다루겠습니다.
 
구글 맵키를 받기 위해서는 일단 디버그 키스토어가 어디있는지 알아야 합니다.

일단 이클립스 - 환경설정(Preference)로 들어갑니다.



Android - Build 에서 Default debug keystor 의 위치를 확인합니다.

(저 같은 경우엔 /Users/neoroid/.android/debug.keystore 에 있네요)

다음으로 응용 프로그램 - 유틸리티 - 터미널 을 실행합니다.



아무런 설정을 하지 않았다면 맥에서는 .으로 시작되는 파일 또는 디렉토리가 보이지 않습니다.

ls -al 을 입력해봅니다.

(.android가 보이시나요?)

cd .android 를 입력하여 .android 디렉토리로 들어 간 후 ls 를 입력해봅니다.

(debug.keystore가 보입니다.)

 
이제 키 발급을 위해 다음과 같은 명령어를 입력합니다.

keytool -list -alias androiddebugkey -keystore debug.keystore -storepass android -keypass android


(MD5 : 다음에 나오는 키가 디버그 키입니다. 제 키는 살짝 지웠습니다.)

키를 드래그하여  복사한 후

http://code.google.com/intl/ko-KR/android/maps-api-signup.html

 
구글 맵 키 발급 사이트로 들어갑니다.

 

체크박스에 체크를 하고

My certification's MD5 fingerprint 옆의 텍스트 박스에 아까 복사한 키를 붙여넣고 [Generate API Key] 버튼을 클릭합니다.
 


사용자 키를 발급받은 모습입니다. 저 키를 MapView에 사용하여 맵을 불러 올 수 있는 것입니다.

xml 코드)

<com.google.android.maps.MapView
android:layout_width="fill_parent"
 
android:layout_height="fill_parent"
 
android:apiKey="발급받은 사용자 키"
 
/> 

 

신고
Posted by 그린블로그 DEV그린
2011.12.30 14:46
viewflipper는 몇페이지든 서로 붙여놓고 폰에서는 마치 페이지 넘기듯 자연스럽게 구현하는 API입니다.

flipper를 구현하다가 현재 보이는 뷰가 몇 번째 페이지인지 알 수 있는 방법은

viewFlipper.getDisplayedChild()

를 사용하는 것입니다. return형은 int형이며 첫 번째 뷰라면 0을, 두 번째는 1을.

0,1,2,3... 이런 식으로 반환해줍니다. 

가령 '페이지를 넘겼을 때 현재 페이지가 x페이지라면 y메소드를 실행' 이런 것을 구현할 수 있는 것입니다.

ex)

*ViewFlipper 선언 부분 (.java)

//전역변수 선언
ViewFlipper viewFlipper ;
Animation slideInLeft ;
Animation slideInRight;
Animation slideOutLeft ;
Animation slideOutRight;


//onCreate 부분에 선언

viewFlipper = (ViewFlipper) findViewById(R.id.ViewFlipper);
slideInLeft = AnimationUtils.loadAnimation(this, R.anim.slide_in_left);
slideInRight = AnimationUtils.loadAnimation(this, R.anim.slide_in_right);
slideOutLeft = AnimationUtils.loadAnimation(this, R.anim.slide_out_left);
slideOutRight = AnimationUtils.loadAnimation(this, R.anim.slide_out_right); 


* 플링이나 버튼 클릭 시 페이지 이동

//이전 페이지
viewFlipper.setInAnimation(
slideInRight);
viewFlipper.setOutAnimation(slideOutRight);
viewFlipper.showPrevious();

//다음 페이지
viewFlipper.setInAnimation(slideInLeft);
viewFlipper.setOutAnimation(slideOutLeft);
viewFlipper.showNext();

* 현재 페이지에 따른 메소드 실행

switch (viewFlipper.getDisplayedChild()) {
    case 0:  //현재 뷰가 첫 번째 페이지라면 method1() 메소드 실행
    method1();
break;
    case 1: //현재 뷰가 두 번째 페이지라면 method2() 메소드 실행
    method2();
break;
    default:
 
break;
 
}


* 플링 효과를 구현할 애니메이션 xml (res폴더 안의 anim 폴더를 만들어 집어넣습니다.)

slide_in_left.xml

 <?xml version="1.0" encoding="utf-8"?>
 
<set xmlns:android="http://schemas.android.com/apk/res/android">
 
<translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="800"/>
 
</set>

slide_in_right.xml

 <?xml version="1.0" encoding="utf-8"?>
 
<set xmlns:android="http://schemas.android.com/apk/res/android">
 
<translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="800"/>
 
</set> 

slide_out_left.xml 

 <?xml version="1.0" encoding="utf-8"?>
 
<set xmlns:android="http://schemas.android.com/apk/res/android">
 
<translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="800"/>
 
</set> 

slide_out_right.xml 

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromXDelta="-100%p" android:toXDelta="0" android:duration="800"/>
</set> 

신고
Posted by 그린블로그 DEV그린
2011.12.15 10:18
노티피케이션을 설정한 후 CANCEL FLAG를 설정하지 않으면 

클릭 시에도 사라지지 않아 보기 지저분 한 경우가 있습니다.

이럴땐 선언한 노티피케이션 변수에 아래와 같은 FLAG를 설정하면

클릭 시 깔끔하게 사라지는 모습을 볼 수 있습니다.

noti.flags |= Notification.FLAG_AUTO_CANCEL;


예제)

NotificationManager NotiManager;

NotiManager = (NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Notification noti = new Notification(R.drawable.ic_launcher"노티피케이션 테스트",System.currentTimeMillis());
noti.defaults |= Notification.DEFAULT_SOUND;
noti.flags |= Notification.FLAG_INSISTENT;
noti.flags |= Notification.FLAG_AUTO_CANCEL;


Notification Field
 

Notification.DEFAULT_SOUND : 소리 발생
Notification.DEFAULT_VIBRATE : 진동을 발생
Notification.DEFAULT_LIGHTS : 불빛 발생
Notification.DEFAULT_ALL : 상단의 세 가지를 모두 실행

Notification.FLAG_ONGOING_EVENT : 노티피케이션이 알림에 뜨지 않고 진행중에 뜨게 되는 플래그  
Notification.FLAG_INSISTENT : 확인 할 때 까지 집요하게 사운드를 울려주는 플래그
Notification.FLAG_NO_CLEAR : 앱의 프로세스를 종료하지 않는 한 노티를 제거 할 수 없게 만드는 플래그
Notification.FLAG_ONLY_ALERT_ONCE : 취소되더라도 매번 소리와 진동을 발생하는 플래그
Notification.FLAG_SHOW_LIGHTS : LED 불빛을 출력하는 플래그


신고
Posted by 그린블로그 DEV그린
2011.12.08 17:07
안드로이드에서 음력을 구하는 법을 알아보겠습니다.

현재 음력을 구하는 라이브러리가 제공되고 있으므로 간단하게 구현하는 것은 정말 쉽습니다.
(만세력은 아니지만)

http://site.icu-project.org/download

위의 링크에서 음력 달력을 구하는 라이브러리를 다운 받을 수 있습니다.

받아야 할 파일은

icu4j-4.8.1.jar
icu4j-charset-4_8_1.jar
icu4j-localespi-4_8_1.jar

이렇게 총 3개입니다. 하지만 그냥 가져오면 에러가 나는데요.

그 이유는 jar파일 안에 있는  license.html 파일과 unicode-license.txt 파일 때문입니다.

jar 파일을 열어서 이것들을 각각 제거해줍니다.

일련의 과정이 귀찮을 것 같아 
license파일을 제거해놓은 jar파일과 예제를 첨부해놓았습니다.

 

 이제 적용하는 방법을 알아보자면 다운 받은 후 아래 스샷과 같이 프로젝트에 lib 폴더를 만들어 복사합니다.




그 다음 프로젝트에 오른쪽 마우스를 클릭하여 Properties - Java Build Path 에 들어간 후 

다음 스크린샷의 오른쪽 상단에 있는 [Add JARs...] 버튼을 클릭합니다.



해당 프로젝트를 찾아 아까 생성한 lib 폴더로 들어간 후 복사해넣은 세 jar 파일을 모두 선택한 후 OK를 클릭합니다.


(클릭!)


Java Build Path에 jar 파일들이 추가된 것을 확인할 수 있습니다.


이제 세팅은 끝났습니다.

아래는 간단하게 예제 소스입니다.



public
class Main extends Activity {

ChineseCalendar chineseCalendar;

    /** Called when the activity is first created. */

    @Override

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.main);

Calendar cal = Calendar.getInstance();        

chineseCalendar = new ChineseCalendar();

chineseCalendar.setTimeInMillis(cal.getTimeInMillis());

int y = chineseCalendar.get(ChineseCalendar.EXTENDED_YEAR) - 2637;
int m = chineseCalendar.get(ChineseCalendar.MONTH) + 1;
int d = chineseCalendar.get(ChineseCalendar.DAY_OF_MONTH);

//일자가 10일 보다 적을 때 앞에 0을 붙여줍니다. (11월1일이 11.01이 되어야 하는데 11.1로 나오면 이상하겠죠?)
String lunarDay;
if (d < 10)
lunarDay = "0" + String.valueOf(d);
else
lunarDay = String.valueOf(d);

//결과를 간단하게 로그캣으로 찍어봅니다. 
Log.i("INFO", "오늘은 음력으로 : "+String.valueOf(y)+"년 "+String.valueOf(m)+"월 "+lunarDay+"일입니다!");   

}

}


 

(로그캣 맨 아래줄에 로그가 찍힌 것을 확인할 수 있습니다!) 

신고
Posted by 그린블로그 DEV그린
2011.12.05 15:02

Intent intent = new Intent(A.this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent);

와 같은 방식으로 사용하며

런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우, 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다.
가령 A->B->A 로 호출이 일어나는 경우, B Activity 가 종료 되고, A Activity 만 Task 에 남게 됩니다. (A->B->C->A 인 경우에
마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

만약에 엑티비티스택에 호출하려는 엑티비티의 인스턴스가 이미 존재하고 있을 경우에 새로운 인스턴스를 생성하는 것 대신에 존재하고 있는 엑티비티를 포그라운드로 가져옵니다. 그리고 엑티비티스택의 최상단 엑티비티부터 포그라운드로 가져올 엑티비티까지의 모든 엑티비티를 삭제합니다.


예를 들면 현재 ABCDE순서로 엑티비티가 스택에 들어있다고 할때 엑티비티E에서 C를 호출하게 되면 D와 E는 스택에서 삭제되고 ABC만이 남아있게 됩니다. 여기서 AB 역시 남는다는 것을 이해하셔야 합니다.

신고
Posted by 그린블로그 DEV그린
2011.09.29 13:00

1. 일단 res 폴더안에 raw 폴더를 만들고 될 수 있으면 ogg 파일로 넣는다. (mp3 파일보다 에러가 적다)

 

2. MusicService 클래스를 만든다. (배경음악을 틀어주는 Class)

 

import android.app.Service;
import android.content.Intent;
import android.media.MediaPlayer;
import android.os.IBinder;
import android.util.Log;

 

public class MusicService extends Service {
 
 public MediaPlayer mp;

 

 public IBinder onBind(Intent arg0) {

  return null;
 }

 

 public void onStart(Intent intent, int startId) {
  Log.i("Example", "Service onStart()"); 

  super.onStart(intent, startId);
  mp = MediaPlayer.create(this, R.raw.ashi);
  mp.setLooping(true); // 반복 재생 설정 (true와 false로 조정 가능)
  mp.start(); //음악 재생


 }

 public void onDestroy() {
  Log.i("Example", "Service onDestroy()");
  super.onDestroy();
  mp.stop(); //음악 정지
 }
}

 

3. AndroidManifest.xml에 다음과 같이 설정한다.

 

<service android:name=".MusicService">
      <intent-filter>
       <action android:name="com.Example.service.test/>
       <category android:name="android.intent.category.DEFAULT"/>
      </intent-filter>
  </service>

 

4. 음악을 틀어줄 Activity에 startService와 stopService로 배경음악을 제어한다.

 

public class Example extends Activity

 

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        startService(new Intent("com.Example.service.test")); //Activity 시작과 함께 배경음악을 재생한다.

.

.

.

 

// Back키를 누르면 종료되는 Method
//AndroidManifest.xml에 <uses-permission android:name="android.permission.RESTART_PACKAGES"></uses-permission> 설정 할 것.

public boolean onKeyDown(int keyCode, KeyEvent event){

        switch (keyCode){
        case KeyEvent.KEYCODE_BACK:
         exit();
        }
          return super.onKeyDown(keyCode, event);    

 }   

        public void exit(){
            ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
            am.restartPackage(getPackageName());
           
 stopService(new Intent("com.Example.service.test")); //종료되면 배경음악이 꺼진다.

    }

신고
Posted by 그린블로그 DEV그린
2011.09.29 12:41

density : [Low density (120), ldpi] [Medium density (160), mdpi] [High density (240), hdpi]



◈ (dip -> px) DIP 값 구하기


 dip = px * (160/density)

(hdpi 기준) DIP = ( PX / 3 ) * 2
(hdpi 기준) DIP = PX * 0.666



◈ (px -> dip) PX 값 구하기


pixels = dip * (density / 160)

(hdpi 기준) PX = DIP * 1.5
신고
Posted by 그린블로그 DEV그린