'프로그래밍/안드로이드팁'에 해당되는 글 98건

  1. 2012.07.26 [Android] AsyncTask 쓸 때의 팁
  2. 2012.07.20 [Android] WebView에서 이미지 로드 (소스 내 String 적용)
  3. 2012.06.14 [Android] EditText 키보드 안나오게 하는 법 (4)
  4. 2012.06.14 [Android] Activity 생명주기
  5. 2012.06.13 [Android] 가로/세로 전환 시 onCreate가 호출되지 않게 하는 방법
  6. 2012.04.30 [Android] 디바이스 네임과, 디바이스 내 모든 앱의 패키지, 클래스 네임 불러오는 코드
  7. 2012.04.04 [Android] 어플의 CPU 점유율이 이상하게 높을 때
  8. 2012.03.20 [Android] 리스트 스크롤 시 어댑터의 이미지나 글씨가 뒤죽박죽 될 때
  9. 2012.02.09 java/android repace(" ", "+")가 먹히지 않을 때
  10. 2012.02.08 다운로드 받은 pdf 나 apk 파일 실행하기
  11. 2012.01.10 android EditText 키패드 입력 리스너 만들기
  12. 2012.01.04 java Map Key 값 불러오기
  13. 2012.01.03 android 맥에서 Google MapKey 발급 받기 (3)
  14. 2011.12.30 android ViewFlipper 현재 페이지 확인 및 예제 (1)
  15. 2011.12.29 android ScrollView 밑의 LinearLayout의 fill_parent가 먹히지 않을 때 (2)
  16. 2011.12.15 android Notification 지우기 (2)
  17. 2011.12.08 android 음력 구하기
  18. 2011.12.06 java Calendar 클래스
  19. 2011.12.05 intent FLAG_ACTIVITY_CLEAR_TOP
  20. 2011.12.01 Eclipse @Override Annotation 오류
  21. 2011.12.01 Mac eclipse 오른쪽 바=룰러(Vertical ruler)가 사라졌을 때
  22. 2011.12.01 이클립스 - 안드로이드 환경 설정 1
  23. 2011.11.29 android TextView에 marquee 속성 주기
  24. 2011.11.29 android/java 날짜간 차 구하기
  25. 2011.11.29 android R.java 파일이 사라졌을 때
  26. 2011.11.29 android onActivityResult 사용하기 (9)
  27. 2011.10.05 Android ScrollView 위아래 흐려지는 것 방지
  28. 2011.10.05 Android Margin/Gravity 등 속성 주기 (Code)
  29. 2011.09.29 이클립스(Eclipse) Android Layout XML 코드 정렬
  30. 2011.09.29 Listview 스크롤 시 Listview가 검정색으로 변하는 경우
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.06.14 14:54
보통 액티비티에 EditText를 선언해놓으면 

기본적으로 포커싱되서 액티비티가 실행되면 자동으로 자판이 올라오게 되어있습니다.

이것을 조작하는 방법을 알아보겠습니다.

먼저 간단히, 그냥 onCreate()에서 자판이 올라오지 않게 하려면 


AdroidMenifast.xml에 등록해놓은 Activity 애트리뷰트에 


android:windowSoftInputMode="stateHidden|adjustPan"


속성만 주시면 됩니다.



하지만 한 액티비티에서 어떤 경우엔 자판이 올라와야 하고 어떤 경우엔 안올라오게 해야한다면?


위의 속성 그대로에 EditText에 클릭 이벤트를 준 후 


그 이벤트에 InputMethodManager를 이용하여 자판을 띄우면 쉬울 것이라 생각하기 쉽습니다.


ex Fail)


EditText testEdt;

...

testEdt = (EditText)findViewById(R.id.testEdt);

testEdt.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub

                InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

                mgr.showSoftInput(testEdt, InputMethodManager.SHOW_IMPLICIT); 

            }

        });

     }


그런데 안됩니다.






해결 방법은 간단합니다. android:windowSoftInputMode="stateHidden|adjustPan" 속성을 빼고


EditText 변수에 setInputType(0) 를 선언해주면 됩니다. 


0은 NULL 이라는 소리입니다. 


ex Success)


EditText testEdt;

...

testEdt = (EditText)findViewById(R.id.testEdt);

testEdt.setInputType(0);

testEdt.setOnClickListener(new View.OnClickListener() {

            public void onClick(View v) {

                // TODO Auto-generated method stub

testEdt.setInputType(1);

                InputMethodManager mgr = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);

                mgr.showSoftInput(testEdt, InputMethodManager.SHOW_IMPLICIT); 

            }

        });

     }


InputMethodManager를 빼지 않는 이유는 이것을 뺀다면 두번 터치해야 키보드가 올라오기 때문이랍니다~



Posted by 그린블로그 DEV그린
2012.06.14 10:07


안드로이드 액티비티 생명주기


onCreate()는 액티비티가 시작될 때 한번만 실행되고 


onResume()는 액티비티가 화면에 보여질 때마다 실행된다.


  




Posted by 그린블로그 DEV그린
2012.06.13 08:44


안드로이드에서는 기본적으로 방향 전환을 하면 


onCreate() 가 호출됩니다.


그래서 방향이 바뀔 때 마다 onCreate()에 선언해 놓은 소스들이 재실행되는데 그걸 막기 위해서는


AndroidMenifast.xml 에 선언된 Activity에


android:configChanges="orientation|keyboard"


속성을 추가시키면 방향전환되도 onCreate가 다시 호출되지 않습니다.



Posted by 그린블로그 DEV그린
2012.04.30 16:38

  PackageManager pm = getPackageManager();

   Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
   mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
   List<ResolveInfo> appList = pm.queryIntentActivities(mainIntent, 0);
   Collections.sort(appList, new ResolveInfo.DisplayNameComparator(pm));
  
   Log.d("TEST","Device Name["+android.os.Build.DEVICE+"]");
  
   for(int i=0; i<appList.size(); i++){
    Log.d("INFO","PakageName["+appList.get(i).activityInfo.applicationInfo.packageName+"]");
    Log.d("INFO","ClassName["+appList.get(i).activityInfo.name+"]");     
  }



Posted by 그린블로그 DEV그린
2012.04.04 17:07

가끔 어플을 실행하고 작업 관리자를 실행했을 때

제작중인 어플의 CPU 점유율이 100%로 빨갛게 되는 경우가 있습니다.

그 이유는 Thread를 Sleep하지 않았기 때문인데요~

돌리고 있는 Thread가 있다면 Sleep 시켜줍시다~ 

Posted by 그린블로그 DEV그린
2012.03.20 16:43
리스트 어댑터로 리스트 로우에 특정 이미지나 글자를 넣고자 할 때 

첫화면에선 제대로 표기되자만 스크롤을 할 때 갑자기 이미지나 글자가 뒤죽박죽 되는 경우가 있다.

그것은 리스트 어댑터의  getView에서 스크롤 할 때 마다 이전 로우의 값을 기억하고 있기 때문이었다!!

스크롤을 할 때 마다 불려지기 때문에 이미 사용된 값을 재사용 하기 때문에 다음 로우가 괴상하게 뒤바뀌는 것이었다.

가령 처음 로딩 했을 때

1
2
3
4
5
6
...

이던 것이 

스크롤을 밑으로 한번 내리고 나면 

....
4
5
6
6
6
6

이런식으로 변하고 다시 올리면

6
6
6
6
6

1,2,3,4,5의 값조차 이렇게  6으로 바뀌는 것이다. 

해결책은 간단했다.

이것을 막기 위해서 getView 초기 부분에 로우의 해당 데이터 값을  null로 선언하니까 정상적으로 출력되었다.  

버그인지는 모르겠으나 스크롤 시 값이 뒤죽박죽이 된다면 필시 어댑터의 getView 떄문일 것이다. 


 
Posted by 그린블로그 DEV그린
2012.02.09 10:38
String str = URLDecoder.decode(getParameters().getParam("파라미터").toString());

로 파라미터를 받았는데 +기호가 공백문자로 변경되어있다.

하지만 +기호까지 필요할 경우 따로 스트링 변수 선언을 하여 replace 해주면 먹히지 않는다.

하지만 

String str = URLDecoder.decode(getParameters().getParam("파라미터").toString()).repace(" ", "+"); 

이렇게 붙여주면 먹힌다.

신기할 따름이다 ㅡㅡ; 
Posted by 그린블로그 DEV그린
2012.02.08 17:57

    public void ExecuteApk()

    {

    File apkFile = new File("/mnt/sdcard/download/11.pdf");

//    File apkFile = new File("/mnt/sdcard/download/11.apk");

        Uri apkUri = Uri.fromFile(apkFile);

        try 

        {

//        Intent intent = new Intent(Intent.ACTION_VIEW);

    Intent intent = new Intent();

    intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    intent.setAction(android.content.Intent.ACTION_VIEW);

    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

//         intent.setDataAndType( Uri.fromFile(apkFile), "application/vnd.android.package-archive");

         intent.setDataAndType(Uri.fromFile(apkFile), "application/pdf");

         

         startActivity(intent);

         

         this.finish();           // liveupdate 프로그램 종료

        } 

        catch (Exception e) 

        {

    // TODO: handle exception

        }

    }



- 주석처리한 부분은 apk 실행 부분입니다. 

Posted by 그린블로그 DEV그린
2012.01.10 11:00

어플에서 키패드의 다음, 검색, 완료에 해당하는 이벤트를 넣고 싶을 때 사용합니다.

<XML>
..
android:imeOptions="actionNext" 
android:imeOptions="actionSearch" 
android:imeOptions="actionDone"


<CLASS>

((EditText) findViewById(R.id.title)).setOnEditorActionListener(new OnEditorActionListener() {
@Override
public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
if(actionId == EditorInfo.IME_ACTION_DONE){
                                ////////////////TODO!!!//////////////
                        }
                  } 

Posted by 그린블로그 DEV그린
2012.01.04 17:22

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


 
java.util.Set keyset = map.keySet();
Object[] hashkeys = keyset.toArray();

for(int i=0; i<hashkeys.length; i++) {

Integer key = (Integer)hashkeys[i];
Log.i("INFO", "key : "+key);



* TreeMap을 쓰면 키값이 정렬이 되는 장점이 있습니다. HashMap 호환됩니다.

* 넣기 : map.put(key, value);
* 지우기 : map.remove(key); 


ex)

int[] alarmInMinute;

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

java.util.Set
keyset = map.keySet();
Object[] hashkeys = keyset.toArray();

alarmInMinute = new int[hashkeys.length];

for(int i=0; i<hashkeys.length; i++) {
Integer key = (Integer)hashkeys[i];
Log.i("INFO", "key : "+key);
alarmInMinute[i] = map.get(key);
map.remove(key);

}

schedule.setAlarmInMinute(alarmInMinute);


 

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.29 13:35
간혹 스크롤뷰 밑의 리니어 레이아웃의 fill 속성이 먹히지 않을 때가 있습니다.
ScrollView와 Linear에 모두 fill을 줬는데도 Linear가 fill_parent 속성을 인식하지 못하는 이유는
스크롤 뷰에 다음과 같은 속성을 주지 않았기 때문입니다.   

android:fillViewport="true" 

<ScrollView
 android:id="@+id/ScrollView"
 android:layout_width="fill_parent"
 
android:layout_height="fill_parent"
 
android:fillViewport="true"
 
android:fadingEdge="none"


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.06 14:58
캘린더를 쓰기 전 항상 초기화부터!

Calendar cal = Calendar.getInstance();


주요 API

SECOND
: 초 (11:01:33에서 값은 33)
MINUTE : 분 ( 11:01:33에서 값은 1)
HOUR : 시 (11:01:33에서 값은 11)
HOUR_OF_DAY : 시 (24시간 기준, 예를 들어 22시,23시..등)
 
DAY_OF_WEEK : 월, 화, 수...
DAY_OF_MONTH :  달 중의 하루
DAY_OF_YEAR : 연 중의 하루

WEEK_OF_MONTH : 그 달에서 몇째 주인지 (첫 주는 값이 1) 
WEEK_OF_YEAR : 그 해에서 몇째 주인지 (첫 주는 값이 1)  



실 사용 예 (cal은 맨 위에서 선언한 Calendar cal = Calendar.getInstance(); 에서 가져왔다고 칩니다)

cal.set(Calendar.MONTH, -1); //현재 달을 한달 전으로 설정합니다.
cal.set(Calendar.DAY_OF_MONTH,1); //날짜를 현재 달의 1일로 설정합니다.
cal.add(Calendar.MONTH, 1);  //현재 달에 한달을 더합니다.


 

* 그 달의 마지막 날 구하기

cal.set(Calendar.DAY_OF_MONTH,1); //현재 달의 일자를 1일로 변경 후
cal.set(Calendar.MONTH, +1); //현재 달에 한달을 더합니다.
cal.add(Calendar.DAY_OF_YEAR, -1); 그 후 그 달에서 하루를 빼주면 현재달이 마지막 날짜가 구해집니다!

 

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.12.01 16:50

가끔 이클립스로 새 Workspace를 만들어 기존의 프로젝트를 Import 할 때 

Console창에 Fix Project Properties가 뜨고 Clean을 했는데 @Override 쪽에 에러가 나는 경우가 있습니다.

원인은 Compiler가 1.6 미만이기 때문인데요.

메뉴바의

환경설정 - Java - Compiler 

에 보시면 Compiler compliance level 에 다음 스크린샷과 같이 1.6으로 안되있고 1.4나 1.5로 되어있을 것입니다.

이것을 1.6으로 바꾸고 Apply 하시면 에러가 말끔히 사라집니다. ^^ 

만약, 이렇게 해도 사라지지 않으면 해당 프로젝트에 오른쪽 마우스 클릭 - Properties 로 들어가서 Compiler의 버전을 확인해주세요~ 



Posted by 그린블로그 DEV그린
2011.12.01 16:41
맥에서 이클립스를 실행했을 때 OS가 라이언이고 인디고를 사용할 경우

Vertical ruler, 즉 에러나 경고를 오른쪽 스크롤 바 바로 옆에 표시해주던 룰러가 사라지는 경우를 볼 수 있습니다.

저도 이 문제로 꽤나 고심하다가 해외에서 같은 경우를 볼 수 있었는데...
http://stackoverflow.com/questions/6780269/running-eclipse-on-mac-os-x-lion



결과적으로 이클립스 제작팀의 버그라고 합니다. ㅡ_ㅡ;

이럴 경우, 메뉴바의

Help - Check for Updates

를 보시면 이클립스 업데이트가 떠 있을 것입니다. 업데이트 하고 재실행 하면  Vertical ruler가 제대로 떠 있는 것을 볼 수 있을 것입니다.

만약 업데이트 했는데도 Vertical ruler가 보이지 않는다면 설정문제입니다.

환경설정 - General - Editors - Text Editors - Annotations

으로 가서 Vertical ruler가 체크되어 있는지 확인 한 후 체크해주시면 됩니다.

Posted by 그린블로그 DEV그린
2011.12.01 15:01
메뉴바에서 Help - Install New SoftWare 로 들어간 후

add 버튼을 클릭하고 

Name : android (아무거나 줘도 상관없음)

Location : https://dl-ssl.google.com/android/eclipse/

입력 후 확인합니다.

 

그 후 드롭다운에서 

android - https://dl-ssl.google.com/android/eclipse/

를 선택하면 

Pending... 이 뜨면서 설치목록이 뜹니다.


그 후 Next - All Accept~ - 쭉 이어가시면 됩니다. 끝나면 Restart Now 버튼을 클릭하여 재시작 해주시면 1차 세팅은 완료되는 것입니다.

Posted by 그린블로그 DEV그린
2011.11.29 09:47

<TextView

  android:id="@+id/test"

  android:layout_width="fill_parent"

  android:layout_height="fill_parent"

  android:layout_centerHorizontal="true"

  android:text="가나다라마바사"

  android:textSize="12dip"

  android:textColor="@color/Black"

   android:gravity="center"

   android:singleLine="true"

   android:focasable="true"

   android:ellipsize="marquee"

 />


위의 bold로 되어있는 속성들이 중요합니다. 텍스트뷰에 저렇게 속성을 준 뒤 자바 소스 상에서 


textview.setSelected(true); 


이렇게 따로 속성을 줘야 합니다.

Posted by 그린블로그 DEV그린
2011.11.29 09:46

//종료날짜와 시작날짜의 차 구하기.

Calendar startDate = Calendar.getInstance();

Calendar endDate = Calendar.getInstance();

   

//년, 월, 일을 설정해준 후

startDate.set(Integer.parseInt("2011"), Integer.parseInt("11")-1, Integer.parseInt("1"));

endDate.set(Integer.parseInt("2011"), Integer.parseInt("11")-1, Integer.parseInt("10"));


//여기서 월에 -1을 해주는 이유는 0을 1월로 인식하기 때문입니다. 그러므로 11월은 10이 되어야 겠죠?

//사족 - 년월일을 스트링으로 준 이유는 실무에 들어가면 숫자를 직접 넣기 보다는 값을 받아오거나 DB에서 직접 가져오는데 String형이 자주 이용되기 때문입니다. 만약 정말 간단하게 넣으려면

startDate.set(2011, 10, 1); - 2011년 11월 1일

endDate.set(2011, 10, 10); - 2011년 11월 10일

이렇게 주면 되겠죠.


//시작날짜와 종료날짜 차 만큼 날짜 배경색상 변경할 칸수를 담아두는 변수를 선언하고.

long a = 0; 


//종료날짜와 시작날짜의 차를 구합니다.

//두날짜간의 차를 얻으려면 getTimeMills()를 이용하여 천분의 1초 단위로 변환하여야 합니다.

long b = (endDate.getTimeInMillis() - startDate.getTimeInMillis()) /1000; 

a = b/(60*60*24);


Log.i("INFO""종료날짜와 시작날짜의 차 : "+a);


결과는 10-1 해서 9가 나오겠네요. ^^
 

Posted by 그린블로그 DEV그린
2011.11.29 09:44

간혹 프로젝트 저장 시에 R파일이 사라지는 경우가 있습니다.


project - clean을 해도 안되는 경우가 있는데 원인에는 여러가지가 있습니다.


원인


1. xml 파일 생성 시 파일 이름에 소문자 알파벳, 언더바(_), 숫자 이외에 다른 것이 들어갔을 때.


2. 가져온 xml 파일의 경우 그 안의 리소스가 없을 때.

Posted by 그린블로그 DEV그린
2011.11.29 09:42

onActivityResult는,


정말 간단하게 설명하면 Activity A와 B가 있을 때,


A에서 B로 갔다가 다시 A로 넘어올 때 사용하는, 안드로이드에서 제공하는 기본 메소드입니다.


이 메소드의 대표적인 용도 중 하나는 커스텀 다이얼로그를 사용할 때 입니다.


커스텀 다이얼로그를 짤 때 가장 쉬운 방법으로 액티비티를 다이얼로그화하는 경우가 있습니다.


하지만 액티비티를 이동할 때


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

startActivity(intent);

finish();


혹은 


startActivity(new Intent(this, B.class));

finish();


이런식으로 넘기는 경우가 있는데 다이얼로그가 호출되면 배경화면으로 A 액티비티가 반투명하게 보여야 하지만


finish()를 해버렸기 떄문에 보이지 않습니다.


finish()를 하지 않더라도 위의 방식을 사용할 경우, A로 다시 값을 가져와야 하는 경우에는 intent.puExtra로 값을 넘겨야 하는데


그러면 다시 인텐트를 호출하게 되므로 B로 넘어가기 전의 A를 finish() 하지 않았기 때문에 결과적으로 A 액티비티가 


두번 호출되는 단점이 있습니다.


B 액티비티에서 A액티비티로 자연스럽게 값을 넘기면서 돌아오기 위해서는 일단 A 액티비티에서


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

            startActivityForResult(intent, 0);


이런식으로 B로 넘어가 A액티비티를 종료하지 않게 한 후


B에서 다시 A로 넘어 올 때 


setResult(resultCode);

finish();


단 두줄로 종료해 주거나 A로 값을 넘겨준다면


Intent intent = new Intent();

intent.putExtra("key", value);

setResult(RESULT_CODE, intent);

finish();


이렇게 넘겨줍니다.


이 때 B에서 setResult의 괄호안에 있는 resultCode에 정수형 변수를 넣어주어(예를 들면 0,1,2...) A로 넘기게 되는 것입니다.


다시 A 액티비티로 돌아왔을 때 A 액티비티에 선언된 onActivityResult는 B의 setResult의 resultCode 신호를 감지하여


작업을 행하게 되는데 두줄로 끝냈을 경우 이 부분의 소스는 이렇습니다. 


protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

switch (resultCode) {

   case 1:

////////////////////////////

//B의 신호를 받아 실행할 작업

////////////////////////////

   break;


default:

   break;

}

}


만약 B에서 


setResult(1);

finish();


와 같은 결과로 액티비티를 종료했다면 A에서는 setResult의 resultCode인 정수 1을 인지하여 


onActivityResult의 case 1에 해당되는 부분을 실행하게 됩니다.



그리고 B에서 A로 값을 넘긴 경우라면 


protected void onActivityResult(int requestCode, int resultCode, Intent data) {

super.onActivityResult(requestCode, resultCode, data);

switch (resultCode) {

   case 1:

String key = data.getStringExtra("key");

////////////////////////////

//B의 신호를 받아 실행할 작업

////////////////////////////

   break;


default:

   break;

}

}


위에서 강조표시를 한 것 처럼 key값을 받아와서 그 키값으로 다음 작업을 하는 것입니다.
 

Posted by 그린블로그 DEV그린
2011.10.05 16:41
스크롤뷰를 추가한 레이아웃의 길이가 화면을 초과하면 아랫 부분이 흐려지는 현상을 볼 수 있는데요.

이런 현상을 방지하려면 레이아웃 xml의 ScrollView 태그 안에

android:fadingEdge
=
"none" 을 추가해주시면 됩니다.

실제 소스)

 <ScrollView
 android:layout_width="fill_parent"
 android:layout_height="fill_parent"
 android:fadingEdge="none"
 >


Posted by 그린블로그 DEV그린
2011.10.05 14:28
LinearLayout layout;

void
addGroupName(String strGroupName){

TextView tvGroupName =
new TextView(this);
tvGroupName.setText("텍스트를 지정합니다."); //텍스트뷰의 텍스트를 지정해줍니다.
tvGroupName.setTextSize(17.5f); //텍스트뷰의 글자 크기를 지정해줍니다.
tvGroupName.setGravity(Gravity.CENTER_VERTICAL); //텍스트뷰의 Gravity를 지정해줍니다.
tvGroupName.setTextColor(Color.WHITE); //텍스트뷰의 색상을 지정해줍니다.
tvGroupName.setBackgroundResource(R.drawable.quality_bar); //텍스트뷰의 배경을 지정해줍니다.
layout.addView(tvGroupName); //레이아웃에 붙입니다.

//마진 속성을 부여합니다. 마진은
addView 이후에 지정해주어야 제대로 적용됩니다.
ViewGroup.MarginLayoutParams margin =
new ViewGroup.MarginLayoutParams(tvGroupName.getLayoutParams());
margin.setMargins(0, -10, 0, 0);
tvGroupName.setLayoutParams(new LinearLayout.LayoutParams(margin));
}

Posted by 그린블로그 DEV그린
2011.09.29 13:04

코드 정렬 단축키 Crtl + Shift + F !


하지만 기본 포맷 상태로 실행하게 되면 안드로이드 XML에서는 보기 싫은 모양이 나옵니다.


그래서 세로형으로 코딩하기 위해 설정을 잡아줍니다.


XML > XML Files > Editor > Line width 를 24로 설정한 후 확인.


 

이제 Crtl + Shift + F 한번이면 정리됩니다~



Posted by 그린블로그 DEV그린
2011.09.29 13:01

Listview에 배경을 넣었을 때 스크롤을 하다보면 리스트 내용의 배경색이 검정색으로 변하는 경우를 볼 수 있는데


그럴 때는 Listview가 설정되어 있는 XML 파일로 가서 


android:cacheColorHint="#00000000"


속성을 주면됩니다.

Posted by 그린블로그 DEV그린