'프로그래밍'에 해당되는 글 158건

  1. 2013.07.04 [SELECT] SQLite NULL 체크
  2. 2013.05.30 [Android] 날짜간의 차를 시간과 분으로 나타내기
  3. 2013.05.18 이클립스 주노에서 XML이 느려질 때
  4. 2013.05.05 Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1) 해결법 (2)
  5. 2013.04.26 cfood
  6. 2013.04.21 with dami talk
  7. 2012.12.20 [Android] 프로젝트 안의 .svn 폴더 지우기
  8. 2012.11.19 [Android] Button 클릭 시 Text 색깔을 바꿔보자!
  9. 2012.11.15 [Java] Replace 시 주의 할 점 (1)
  10. 2012.11.07 [Android] ViewPager Swiping 막기 (스크롤 막기) (5)
  11. 2012.11.07 [Android] WebView 뒤로가기
  12. 2012.11.01 [Android] 스택에 쌓인 액티비티 모두 종료하기 (2)
  13. 2012.10.22 [Android] Button RepeatListener (버튼 눌림 반복) (1)
  14. 2012.10.22 [Android] autolink 에러 Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?
  15. 2012.10.15 [Android] 젤리빈 openFileChooser 에러 (3)
  16. 2012.09.27 [Android] 맥에서 svn 체크아웃이 안될 때
  17. 2012.09.27 apple json
  18. 2012.09.26 [Android] 키값이 String인 Map을 for문돌려 key,value값 가져오기
  19. 2012.09.26 [Android] Json Key, Value값 Map에 집어넣기
  20. 2012.09.13 [Java] float 소수점 버리기 (반올림 방지)
  21. 2012.08.27 [Android] map.ceilingKey의 힘 (null값을 처리해준다!)
  22. 2012.08.24 [Android] TreeMap Sort (Value 값 내림차순)
  23. 2012.08.07 [Android] DIP 값으로 Pixel 값 얻기
  24. 2012.08.03 [Android] WebView에서 img 태그를 쓸 때 width='100%'가 먹지 않는 경우
  25. 2012.08.02 [iPhone] 문자열 포함 조건문 (contains)
  26. 2012.08.01 [Android] 폰/태블릿 분기 태우기 (Code)
  27. 2012.07.26 [Android] AsyncTask 쓸 때의 팁
  28. 2012.07.20 [Android] WebView에서 이미지 로드 (소스 내 String 적용)
  29. 2012.07.19 [iPhone]아이폰/아이패드 구분하기
  30. 2012.07.19 [iPhone]stringWithFormat (문자열 합치기)
2013.07.04 16:38

Sqlite에서 NULL값을 SELECT 해보는 방법을 알아봅시다.


B테이블A컬럼의 값이 NULL인 것만 SELECT 하려면 아래와 같은 쿼리를 날립니다.


SELECT A컬럼 FROM B테이블 WHERE A컬럼 is NULL;


참~ 쉽죠? :)

Posted by 그린블로그 DEV그린
2013.05.30 14:37

Calendar c1 = Calendar.getInstance();

Calendar c2 = Calendar.getInstance();

c1.setTime(StringUtil.parseDate(시작시간));

c2.setTime(StringUtil.parseDate(종료시간));

long a = 0;

long b = (c2.getTimeInMillis() - c1.getTimeInMillis()) /1000;

a = b/(60 * 60); //시간 구하기

                                   

long hourToMinute = a * 60; //구해진 시간을 분으로 변환

                                   

long ultimateMinute = ( b/(60) ) - hourToMinute; //날짜간 차를 분으로 변환 한 것에 구해진 시간을 분으로 변환한 것을 뺌

                                   

Log.i("INFO", "a : "+a+"시간///"+ultimateMinute+"");





덤) 분을 시간과 분으로 나타내기


예를들어 150분


int h = 150 / 60 = 3(시간)

int m = 150 % 60 = 30(분)


Posted by 그린블로그 DEV그린
2013.05.18 00:55

이클립스 주노에서 왜 이렇게 xml이 느려지나 했더니 테마 때문이었네요.. 


기본이 Windows 7로 되어있는데 Classic으로 바꾸고 


Use mixed fonts and colors for labels 체크를 풀어주고 재시작 하시까 끊김이 사라졌습니다.


여러모로 골치아픈 버전입니다..



Window - Preferences 클릭!



General - Appearance 클릭!



Theme을 Classic으로 바꾸고 


Use mixed fonts and colors for labels 체크 해제 후 OK버튼 클릭!


재시작하면 테마가 클래식으로 돌아와있는걸 확인 하실 수 있습니다. ^^


Posted by 그린블로그 DEV그린
2013.05.05 13:27

ViewPager 관련으로 프로그램을 짜고 있다가 


갤노트2에서는 잘되던게 옵티머스G 프로에만 가면 


Fatal signal 11 (SIGSEGV) at 0x00000008 (code=1) thread xxxxx~


이런 에러를 뱉으며 죽더군요. 충격과 공포에 빠지면 헬지를 욕했지만 


해결책은 꽤나 간단한 곳에 있었습니다.


해당 Activity가 정의된 AndroidManifest.xml에


android:hardwareAccelerated="false" 속성을 넣어주기만 하면 됩니다.


하드웨어가속 이놈 이거 한두가지로 속썩이는게 아닙니다. 이것뿐만 아니라 동영상 관련쪽에서도 문제였고..


아무튼~ 고생하시지 말고 android:hardwareAccelerated="false" 이걸로 간단하게 해결보세요~



Posted by 그린블로그 DEV그린
2013.04.26 00:57
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
-Json시작-{"result":[{"rank":1,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!","package":"com.sword.goodness","imgUrl":"http://cfile25.uf.tistory.com/image/246FC635589FE377021FF9","type":"N","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":2,"name":"커플디데이","detail":"다시 태어난 커플 디데이!","package":"com.dday.couple","imgUrl":"http://cfile3.uf.tistory.com/image/990803335A07640703869B","type":"H","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":3,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!!","package":"com.sword.goodness","imgUrl":"http://cfile8.uf.tistory.com/image/25607E3D57ED7B78371EBE","type":"B","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":4,"name":"아이돌 키우기","detail":"나만의 아이돌을 키워보세요!","package":"com.idol.manager","imgUrl":"http://cfile7.uf.tistory.com/image/2143B94357C7B7342156F0","type":"B","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":5,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!.","package":"com.sword.goodness","imgUrl":"http://cfile25.uf.tistory.com/image/246FC635589FE377021FF9","type":"H","on":1,"imgAll":"a","update":1.6,"ad":2}, {"rank":6,"name":"방탄소년단 빙의글","detail":"독자와 작가가 함께 만들어가는 방탄소년단 빙의글!","package":"com.appFactory.bts","imgUrl":"http://cfile2.uf.tistory.com/image/244658455778E6703078D6","type":"H","on":1,"imgAll":"http://cfile27.uf.tistory.com/image/01598A4651924BC519A8CE","update":-1,"ad":0}, {"rank":7,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!^","package":"com.sword.goodness","imgUrl":"http://cfile22.uf.tistory.com/image/266ABE41562E5DEC11D46D","type":"B","on":2,"imgAll":"a","update":4.5,"ad":1}, {"rank":8,"name":"여신의 탑 RPG","detail":"1지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!","package":"com.sword.goodness","imgUrl":"http://cfile2.uf.tistory.com/image/210B3B3F562E5D0A1F4727","type":"B","on":0,"imgAll":"a","update":6.3,"ad":1}, {"rank":9,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!!","package":"com.sword.goodness","imgUrl":"http://cfile29.uf.tistory.com/image/225CEE40562E5DC4234795","type":"G","on":1,"imgAll":"http://cfile27.uf.tistory.com/image/01598A4651924BC519A8CE","update":-1,"ad":0}, {"rank":10,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!!","package":"com.sword.goodness","imgUrl":"http://cfile25.uf.tistory.com/image/2172D343540BDC0C22D5E7","type":"","on":1,"imgAll":"a","update":4.3,"ad":2}, {"rank":11,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!!","package":"com.sword.goodness","imgUrl":"http://cfile5.uf.tistory.com/image/2131F3445325C7EC12D9C4","type":"","on":1,"imgAll":"a","update":3.3,"ad":0}, {"rank":12,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!!","package":"com.sword.goodness","imgUrl":"http://cfile2.uf.tistory.com/image/265530355763C95A15845B","type":"N","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":13,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!!","package":"com.sword.goodness","imgUrl":"http://cfile9.uf.tistory.com/image/23498C4151A62E4B267B25","type":" ","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":14,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!","package":"com.sword.goodness","imgUrl":"http://cfile23.uf.tistory.com/image/254FC745562E5D2208600D","type":"","on":0,"imgAll":"http://cfile2.uf.tistory.com/image/2251313F51950D441F06A8","update":9.6,"ad":1}, {"rank":15,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!","package":"com.sword.goodness","imgUrl":"http://cfile8.uf.tistory.com/image/243CC05056C2CDA524EDBA","type":"","on":1,"imgAll":"a","update":1,"ad":0}, {"rank":-1,"name":"하단광고","detail":"http://goo.gl/2VtGRO","package":"http://goo.gl/2VtGRO","imgUrl":"http://cfile22.uf.tistory.com/image/2606174756A0DDAB1B8A78","type":" ","on":1,"imgAll":"http://cfile27.uf.tistory.com/image/272A90495510D2C501AB3B","update":-1,"ad":0}]}-Json끝
Posted by 그린블로그 DEV그린
2013.04.21 22:00
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
-Json시작-{"result":[{"talk":"기초대사량은 1개는 꼭 등록해주세요~ 기초대사량이 1개는 있어야 그래프 오류가 안나요~ 운동하기에서 등록해주시면 돼요~","emo":"no","name":"o"}, {"talk":"일기를 쓰고 싶으시다면 일간리포트의 오른쪽 상단에 있는 오늘의일기로 들어가보세요~","emo":"sm","name":"x"}, {"talk":"이번에 사진공유 게시판이 카페로 바뀌었답니다. 가입 해주셔요~ 헤헤..","emo":"sm","name":"o"}, {"talk":"다이어트는 물 마시는 것도 중요하다는 것 아시죠? 물 자주 마시세요~!","emo":"no","name":"o"}, {"talk":"사실 이건 비밀인데... 저 1kg 쪘어요ㅠㅠ","emo":"sad","name":"o"}]}-Json끝-


Posted by 그린블로그 DEV그린
2012.12.20 08:56


DEL_SVN.BAT


첨부한 DEL_SVN.BAT를 다운받고 


.svn이 존재하는 프로젝트 폴더 안에 집어넣습니다.


그리고 실행.


그러면 알아서 .svn을 제거해줍니다. 


참 쉽죠?



Posted by 그린블로그 DEV그린
2012.11.19 17:27

res 폴더 안에 color 폴더를 만들고 clickable_words.xml 을 만듭니다.

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:color="@color/white" android:state_pressed="true"/>

    <item android:color="@color/gray" />

</selector> 


그 후 selector를 적용할 폴더에 다음과 같이 선언합니다.

<Button

        android:id="@+id/btn"

        android:layout_width="fill_parent"

        android:layout_height="wrap_content"

        android:textColor="@color/clickable_words"

        android:textColorHighlight="@color/clickable_words"

        android:textColorLink="@color/clickable_words"

        android:text="테스트"

        android:textSize="16dip" /> 


세팅이 끝나고 버튼을 클릭해 보면 누르고 있을 때 텍스트가 흰색으로 변하고 떼었을 때는 회색으로 변하는 것을 볼 수 있습니다.



Posted by 그린블로그 DEV그린
2012.11.15 20:56

String str = "aa:aa";


에서 : 만 잘라내고 싶은 경우


str.replaceAll(":", ""); 가 아니라


str = str.replaceAll(":", ""); 을 쳐야 제대로 적용됩니다. ^^


오즈모바일로 출발!

Posted by 그린블로그 DEV그린
2012.11.07 17:01

핵심은 이곳을 참조하시고..~

http://blog.svpino.com/2011/08/disabling-pagingswiping-on-android.html


일단 ViewPager를 상속받은 유틸 클래스를 만들어줍니다.

import java.io.PrintWriter;

import java.io.StringWriter;


import android.content.Context;

import android.support.v4.view.ViewPager;

import android.util.AttributeSet;

import android.util.Log;

import android.view.MotionEvent;



//스크롤 막는 ViewPager

public class CustomViewPager extends ViewPager {


private boolean enabled; //이 것이 스크롤을 막아주는 중요 변수!


public CustomViewPager(Context context, AttributeSet attrs) {

super(context, attrs);

this.enabled = true;

}


@Override

public boolean onTouchEvent(MotionEvent event) {

try {

if (this.enabled) {

// Log.i("INFO", "스크롤 중..");

return super.onTouchEvent(event);

}

catch (Exception e) {

StringWriter sw = new StringWriter();

        e.printStackTrace(new PrintWriter(sw));

        String exceptionAsStrting = sw.toString();

        Log.e("INFO", exceptionAsStrting);

}



return false;

}


@Override

public boolean onInterceptTouchEvent(MotionEvent event) {

if (this.enabled) {

return super.onInterceptTouchEvent(event);

}


return false;

}


public void setPagingEnabled() { //이 메소드를 이용해서 스크롤을 풀어주고

this.enabled = true;

}


public void setPagingDisabled() { //이 메소드를 이용해서 스크롤을 막아줍니다.

this.enabled = false;

}


} 


선언이 끝났으면 실제 소스에 반영합니다.

예를 들어 다음 페이지로 스크롤 할 때 스크롤이 다 끝날 때 까지는 스크롤을 막아주기 위해 유틸 클래스에서 정의한 메소드를 이용해서 처리해줍니다.

     private void nextPage(){

  

      vp_main.setPagingDisabled();

      

      Handler handler = new Handler(){

  public void handleMessage(Message msg){

  vp_main.setPagingEnabled();

vp_main.getAdapter().notifyDataSetChanged();

  }

  };

  handler.sendEmptyMessageDelayed(0, 400);   

     } 




Posted by 그린블로그 DEV그린
2012.11.07 16:56

스마트폰의 뒤로가기 키를 눌렀을 때 웹뷰에서 goBack() 할 수 있을 때 까진 goBack()을 해주고

아니라면 finish(); 시켜주면 됩니다.

ifwebview.canGoBack() ) {

webview.goBack();

}

else {

finish();

}  


Posted by 그린블로그 DEV그린
2012.11.01 15:24

예를들어 A, B, C Activity가 있다고 칩시다.


A에서 B로 갈 때 finish()를 하지 않고 갑니다. 


즉, 


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

startActivity(intent); 


startActivity(intent); 만 이용해서 이동한 것이지요.


그렇게 B로 이동한 후 또 C로 이동합니다. 

Intent intent = new Intent(B.this, C.class);

startActivity(intent); 


이렇게 C로 이동한 후 이동 한 후 C를 종료하면서 A로 바로 이동하고 싶습니다. 그런데 A로 이동하면서 B도 끄고 싶습니다.


이런경우 보통 FLAG_ACTIVITY_CLEAR_TOP 플래그를 이용해서 이동합니다.

Intent intent = new Intent(C.this, A.class);

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

startActivity(intent); 
finish();


하지만 Activity가 많아질 경우 FLAG_ACTIVITY_CLEAR_TOP 은 더이상 통하지 않습니다.


간단하게 처리하기 위해서는 Activity를 상속받은 BaseActivity 클래스를 따로 만들어준 후 ArrayList<Activity>를 이용해서 


추가된  Activity 들을 한번에 종료시켜주는 것이 가장 확실한 방법인 것입니다. 그럼 구현 하는 방법을 알아볼까요?


BaseActivity에 ArrayList<Activity>을 선언해줍니다.

 public static ArrayList<Activity> actList = new ArrayList<Activity>();


그리고 A이동할 메소드에 해당 소스를 넣어줍니다.

actList 에 쌓인 Activity들을 for문을 돌려 모두 finish() 시켜버리는 것입니다.

for(int i = 0; i < actList.size(); i++)

actList.get(i).finish();

intent = new Intent(C.this, A.class);

startActivity(intent);

finish(); 


이렇게만 해주면 제대로 동작하지 않습니다.

목적은 C와 A 사이에 있는 B를 제거하기 위함이므로 B를 actList 에 추가해줍니다.

onCreate()에서 추가해주면 됩니다.

//일단 B를 상속받고... 
public class B extends BaseActivity{


@Override

protected void onCreate(Bundle savedInstanceState) {

actList.add(this); // actList에 B를 추가해줍니다.

super.onCreate(savedInstanceState);

setContentView(R.layout.b);


}


}


이렇게 만들어 놓고 필요시 for문을 돌려 Activity들을 언제든지 삭제할 수 있는 것입니다. ^^



Posted by 그린블로그 DEV그린
2012.10.22 13:54

키보드에서 특정 키를 꾹 누르고 있으면 그 키에 해당하는 문자가 계속 타이핑 되듯이 

안드로이드에서도 특정 버튼을 누르면 어떠한 액션이 반복적으로 실행되는 리스너를 찾아보았습니다. 


원본 링크 : http://stackoverflow.com/questions/4284224/android-hold-button-to-repeat-action


이곳에 보면 버튼 반복 방법이 두가지 나오는데요, 첫번째 보다 두번째 방식이 더 간결하고 쓰기 좋습니다.

(첫번째 방법은 버튼 셀렉터 먹이기가 힘들더군요 ㅇㅁㅇ;)


일단 RepeatListener.java 를 생성합니다.

import android.os.Handler;

import android.view.MotionEvent;

import android.view.View;

import android.view.View.OnClickListener;

import android.view.View.OnTouchListener;


/**

 * A class, that can be used as a TouchListener on any view (e.g. a Button).

 * It cyclically runs a clickListener, emulating keyboard-like behaviour. First

 * click is fired immediately, next after initialInterval, and subsequent after

 * normalInterval.

 *

 * <p>Interval is scheduled after the onClick completes, so it has to run fast.

 * If it runs slow, it does not generate skipped onClicks.

 */

public class RepeatListener implements OnTouchListener {


    private Handler handler = new Handler();


    private int initialInterval;

    private final int normalInterval;

    private final OnClickListener clickListener;


    private Runnable handlerRunnable = new Runnable() {

        @Override

        public void run() {

            handler.postDelayed(thisnormalInterval);

            clickListener.onClick(downView);

        }

    };


    private View downView;


    /**

     @param initialInterval The interval after first click event

     @param normalInterval The interval after second and subsequent click 

     *       events

     @param clickListener The OnClickListener, that will be called

     *       periodically

     */

    public RepeatListener(int initialInterval, int normalInterval, 

            OnClickListener clickListener) {

        if (clickListener == null)

            throw new IllegalArgumentException("null runnable");

        if (initialInterval < 0 || normalInterval < 0)

            throw new IllegalArgumentException("negative interval");


        this.initialInterval = initialInterval;

        this.normalInterval = normalInterval;

        this.clickListener = clickListener;

    }


    public boolean onTouch(View view, MotionEvent motionEvent) {

        switch (motionEvent.getAction()) {

        case MotionEvent.ACTION_DOWN:

            handler.removeCallbacks(handlerRunnable);

            handler.postDelayed(handlerRunnableinitialInterval);

            downView = view;

            clickListener.onClick(view);

            break;

        case MotionEvent.ACTION_UP:

            handler.removeCallbacks(handlerRunnable);

            downView = null;

            break;

        case MotionEvent.ACTION_CANCEL:

            handler.removeCallbacks(handlerRunnable);

            downView = null;

            break;

        }

        return false;

    }


} 


그후 onCreate()에 Button 리스너를 줍니다.

 ((Button)findViewById(R.id.btn)).setOnTouchListener(new RepeatListener(400, 50, new OnClickListener() {

  @Override

  public void onClick(View view) {

  //할 것!!

  }

}));

여기서 400은 처음 터치한 후 반복이 실행되기 까지의 대기시간, 50은 반복속도입니다. 자유롭게 주셔도 됩니다.



Posted by 그린블로그 DEV그린
2012.10.22 12:27

다이얼로그를 띄워 전화번호에 autoLink를 걸었는데 


Calling startActivity() from outside of an Activity context requires the FLAG_ACTIVITY_NEW_TASK flag. Is this really what you want?


라는 에러가 뜬다면 다이얼로그 부분에서 


getApplicationContext()로 선언하지 않았는지 확인합니다.


만약 그렇게 되어있다면 클래스이름.this 로 바꿔주고 테스트하면 정상적으로 작동합니다.



Posted by 그린블로그 DEV그린
2012.10.15 23:24

젤리빈을 업데이트 하면서 갑작스럽게 웹뷰에서 openFileChooser가 먹지 않는 현상이 발생하였습니다.



아이스크림 버전까지는 이렇게 해서 잘 썼지만

 public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {

openFileChooser(uploadFile);

}

 

public void openFileChooser(ValueCallback<Uri> uploadMsg) {

uploadMessage = uploadMsg;

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

startActivityForResult(Intent.createChooser(i, "이미지 첨부"),FILECHOOSER_RESULTCODE);

}


젤리빈부터는 아래와 같이 붉은 색으로 표기한 메소드를 추가해주어야 제대로 읽어옵니다~

 public void openFileChooser(ValueCallback<Uri> uploadFile, String acceptType) {

openFileChooser(uploadFile);

}

 

public void openFileChooser(ValueCallback<Uri> uploadMsg) {

uploadMessage = uploadMsg;

Intent i = new Intent(Intent.ACTION_GET_CONTENT);

i.addCategory(Intent.CATEGORY_OPENABLE);

i.setType("image/*");

startActivityForResult(Intent.createChooser(i, "이미지 첨부"),FILECHOOSER_RESULTCODE);

}


public void openFileChooser(ValueCallback<Uri> uploadMsg, String acceptType, String capture) {

       openFileChooser( uploadMsg, "" );

   }




Posted by 그린블로그 DEV그린
2012.09.27 11:41

맥에서 갑자기 certificate 관련으로 svn 체크아웃이 안되는 경우가 있습니다.


이럴 때는 터미널로 들어가서 다음과 같이 설정해줍니다.


svn ls svs체크아웃주소


Password for 'neoroid': 맥 비번


Username: svn에 등록한 ID
Password for 'ID': svn ID에 등록한 패스워드


그리고 아무런 로그 없이 다음 커맨드가 출력되면 해결된겁니다.

확인은

svn ls svs체크아웃주소

이걸로 다시 해보세요~ ^^


Posted by 그린블로그 DEV그린
2012.09.27 09:55
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
"하하하하호호"
-Json시작-{"result":[{"rank":1,"name":"여신의 탑 RPG","detail":"지금까지 만나 본 적 없는 스파클링 도트 액션 RPG!","package":"com.KnightK","imgUrl":"http://cfile25.uf.tistory.com/image/246FC635589FE377021FF9","type":"N","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":2,"name":"개복치 키우기","detail":"방치형+노가다의 끝판왕을 책임 질 전략형 개복치 키우기","package":"com.chuslab.MolaFish","imgUrl":"http://cfile8.uf.tistory.com/image/2737754757E6A09D20B9A9","type":"H","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":5,"name":"다이어트 헬퍼","detail":"1500만의 다이어트 실패 인구가 있지만 다이어트 헬퍼와 함께라면 성공할 수 있습니다.","package":"com.Diet3","imgUrl":"http://cfile9.uf.tistory.com/image/2541F1455761AC601C1C8D","type":"H","on":1,"imgAll":"a","update":1.6,"ad":2}, {"rank":7,"name":"커플디데이","detail":"연인이라면 필수 어플! 아니라도 디데이용으로^^","package":"com.dday.couple","imgUrl":"http://cfile3.uf.tistory.com/image/990803335A07640703869B","type":"B","on":2,"imgAll":"a","update":4.5,"ad":1}, {"rank":8,"name":"100억 가계부","detail":"100억 부자들의 간편한 가계부 어플!","package":"com.MoneyBook","imgUrl":"http://cfile2.uf.tistory.com/image/210B3B3F562E5D0A1F4727","type":"B","on":0,"imgAll":"a","update":6.3,"ad":1}, {"rank":9,"name":"맘플","detail":"우리 아이를 관리해줄 스마트한 육아 수유 어플!","package":"com.MomsDay","imgUrl":"http://cfile29.uf.tistory.com/image/225CEE40562E5DC4234795","type":"G","on":1,"imgAll":"http://cfile27.uf.tistory.com/image/01598A4651924BC519A8CE","update":-1,"ad":0}, {"rank":10,"name":"스마트 용돈기입장","detail":"간편한 돈관리를 원하신다면!","package":"com.MoneyCare","imgUrl":"http://cfile25.uf.tistory.com/image/2172D343540BDC0C22D5E7","type":"","on":1,"imgAll":"a","update":4.3,"ad":2}, {"rank":11,"name":"물다이어리","detail":"스마트한 물마시기 어플!","package":"com.WaterDiary","imgUrl":"http://cfile5.uf.tistory.com/image/2131F3445325C7EC12D9C4","type":"","on":1,"imgAll":"a","update":3.3,"ad":0}, {"rank":12,"name":"애견 음악 (개진정)","detail":"산만한 당신의 강아지를 안정시켜보세요!","package":"com.DogSound","imgUrl":"http://cfile2.uf.tistory.com/image/265530355763C95A15845B","type":"N","on":1,"imgAll":"a","update":-1,"ad":0}, {"rank":13,"name":"식단일기","detail":"간편한 다이어트 일기 어플!","package":"com.DietDiary","imgUrl":"http://cfile9.uf.tistory.com/image/23498C4151A62E4B267B25","type":" ","on":1,"imgAll":"a","update":-1,"ad":0}]}-Json끝-
Posted by 그린블로그 DEV그린
2012.09.26 15:19

저번 시간에 Json의 키값과 밸류값을 Map에 집어넣는 방법을 알아보았는데요~


정작 Map을 쓰려면 for문으로 작업해야 하는데 웬만하면 map.get(i)로 계산 했기 때문에


Map의 key값이 String형인 경우 for문을 돌리기가 쉽지 않습니다.


그럴 경우 Iterator 를 사용해서 돌리면 됩니다. ^^


 

Iterator<String> iterator = map.keySet().iterator();

    while (iterator.hasNext()) {

        String key = (String) iterator.next();      

        Log.i("INFO", "key : "+key);

        Log.i("INFO", "value"+map.get(key));

    }




Posted by 그린블로그 DEV그린
2012.09.26 14:43

Json을 받아 Map으로 집어넣는 방법입니다.


중요 포인트는 Json의 키 값까지 Map에 담는 것인데요, Json의 키 값은 names() 메소드로 구합니다. ^^



TreeMap<String,String> map = new TreeMap<String,String>();

JSONArray json null;

String jsonString "";


.

...

.......


//Json String을 받는 과정은 생략 후 받았다 치고 Map으로 넣는 과정을 설명합니다.

 json = new JSONArray(jsonString);

        

 JSONObject resultObject = json.getJSONObject(0);

 for (int j = 0; j < resultObject.length(); j++) { //Json의 Object 숫자만큼 for문을 돌립니다.

     //Json의 키와 밸류 값을 맵에 집어넣습니다.

     map.put(resultObject.names().getString(j), resultObject.getString(resultObject.names().getString(j)));

}



Posted by 그린블로그 DEV그린
2012.09.13 17:20

float 형태의 변수를 int형으로 명시하면 자연스럽게 소수점이 버려집니다.


 float a = 1.23456


int b = (int) a ;


//결과값 b = 1


끝!




Posted by 그린블로그 DEV그린
2012.08.27 10:29

map을 만들고 add하고 


map.get(i)로 돌리는데 i에 해당하는 키 값을 이미 지웠다면?! 


map.ceilingKey(i)를 이용하면 됩니다. 즉


map에 키와 밸류값을 추가한 뒤 로그를 찍었을 때


{0=1, 1=2, 2=3} 에서 


키값 1번을 지우면


{0=1, 2=3} 이 됩니다.


여기서 for문으로 map을 돌려버리면 


map.get(i)에서 i가 1일 때 NullPointException이 발생하게 됩니다.


이럴때 


if(map.get(i) == null){

   i = map.ceilingKey(i);

}


를 넣어주면 i는 2로 바뀌어 계산됩니다.



Posted by 그린블로그 DEV그린
2012.08.24 17:45

아래와 같은 메소드를 선언합니다.

public static <K, V extends Comparable<V>> Map<K, V> sortByValues(final Map<K, V> map) {

Comparator<K> valueComparator =  new Comparator<K>() {

    public int compare(K k1, K k2) {

        int compare = map.get(k2).compareTo(map.get(k1));

        if (compare == 0) return 1;

        else return compare;

    }

};

Map<K, V> sortedByValues = new TreeMap<K, V>(valueComparator);

sortedByValues.putAll(map);

return sortedByValues;

}


클래스에 맵을 선언하고

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


아래와 같이 사용합니다.

Log.i("INFO", "map : "+sortByValues(map)); 



Posted by 그린블로그 DEV그린
2012.08.07 08:57

* DIP 값으로 Pixel 값 얻기

 private static float displayDensity = -1f;

  private static final float DEFAULT_HDIP_DENSITY_SCALE = 1.5f;


  public int getPixelByDIP(int dip)

  {

  if(displayDensity==-1f)

  displayDensity = this.getResources().getDisplayMetrics().density;


  return (int)(dip / displayDensity * DEFAULT_HDIP_DENSITY_SCALE+0.5);

  }



Posted by 그린블로그 DEV그린
2012.08.03 10:09

크롬브라우저나 인터넷 익스플로러에서 당연히 쓰이던 width=100%가 안드로이드 WebView에서는 먹히지 않습니다.


해결책은 의외로 간단합니다.


 <img src="yourImage.png" width='100%25' />


원인은 %를 제대로 인식하지 못해서 에러가 나는거였는데요.


%는 %25로 해야 제대로된 문자열 '%'로 인식합니다.


http://www.hypergurl.com/urlencode.html 


이곳에 가면 자동으로 encode, decode 해주는 프로그램이 있습니다.



아까 언급한 사이트로 접속 후 변환하고자 하는 문자열을 쓰고 밑의 Encode버튼을 누르면 자동으로 인코딩 되어 'URL encoded text에 나타납니다.



Posted by 그린블로그 DEV그린
2012.08.02 17:27

안드로이드에서는 txt.contains("") 하나면 쉽게 해결 될 것을 아이폰에서는 드릅게 꼬아놨습니다.

하지만 익숙해지면 괜찮다는거~ 다음을 봐주세요.


* userText가 String 값 "문자열"을 포함하고 있으면 //TODO 부분의 소스를 실행한다.

 if(!([userText rangeOfString:@"문자열"].location == NSNotFound)){

 //TODO

 NSLog(@"문자열이 포함됨");

 }



Posted by 그린블로그 DEV그린
2012.08.01 17:15

* 폰인지 태블릿인지 판별하는 메소드

 static boolean isTablet (Context context) { 

        // TODO: This hacky stuff goes away when we allow users to target devices 

        int xlargeBit = 4; // Configuration.SCREENLAYOUT_SIZE_XLARGE;  // upgrade to HC SDK to get this 

        Configuration config = context.getResources().getConfiguration(); 

        return (config.screenLayout & xlargeBit) == xlargeBit; 

    } 


* 실제 사용

  if(isTablet(this)){

   //TODO 태블릿일 때 적용할 소스

  }



Posted by 그린블로그 DEV그린
2012.07.26 09:00

AsyncTask의 doInBackground에서 통신중에 try catch의 catch에 Toast를 쓰지 말 것.


에러가 난다.


그러므로 catch에서는 전역으로 선언해둔 boolean 값을 false로 먹여놓고 


catch로 넘어올 때 true로 바꾼 다음 


onPostExecute에서 비로소 띄워주는 것이 좋다.


다이얼로그도 마찬가지.


doInBackground에서 조건에 맞춰 다이얼로그를 뜨게 한다음 return을 먹였으나 작동하지 않았다 


그래서 다이얼로그도 같은 방식으로 onPostExecute로 옮긴 결과 제대로 실행이 되었다.


Posted by 그린블로그 DEV그린
2012.07.20 14:37

html을 String에 담아 webview에서 load할 수도 있습니다~

 WebView mWebView = (WebView) findViewById(R.id.webview);


 String summary = "<meta http-equiv='Content-Type' content='text/html; charset=utf-16le'>" +

            "<html>" +

            "<body>" +

    "<img src='http://cfile1.uf.tistory.com/image/1353844D4FE2DDE6049EB7'>" +

            "</body>" +

            "</html>";

 mWebView.loadDataWithBaseURL("a", summary, "text/html", "UTF-8", null);


✭ 주의사항 : 

일부 디바이스에서는 .loadUrl이 제대로 먹지 않는 경우가 많습니다. 

그러므로 항상 .loadDataWithBaseURL을 이용해주세요~


Posted by 그린블로그 DEV그린
2012.07.19 14:55

if([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone){

        NSLog(@"Device info : iPhone");

    } else {

        NSLog(@"Device info : iPad");

    }




이 소스를 넣기 전에 프로젝트 - Target에서 Devices로 되어있는 콤보박스의 값을 Universal로 변경해주어야 한다.

Posted by 그린블로그 DEV그린
2012.07.19 11:23

안드로이드에선 문자열 연결이 +로 모든게 해결되었던 것과 달리 아이폰에선 좀 더 '귀찮게' 변합니다. 


그래서 자바나 안드로이드를 접하다 아이폰을 접하게 되면 기본적인 것부터 헷갈리게 되는데요.


가장 기본적인 문자열 합치기를 알아보겠습니다.



NSString * str = [NSString stringWithFormat:@"%@|%@|%@", @"문자열1번"@"문자열2"@"문자열3"];


NSLog(@"str : %@", str);


로그를 출력해보면 결과 값은 '문자열1번|문자열2번|문자열3번' 으로 출력되는 것을 확인할 수 있습니다.


중간에 보면 |는 구분자로 넣어놨지만 |가 포함된 곳에는 아무 문자열이나 넣어도 상관없습니다.

Posted by 그린블로그 DEV그린