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

  1. 2011.11.29 android R.java 파일이 사라졌을 때
  2. 2011.11.29 android onActivityResult 사용하기 (9)
  3. 2011.11.07 SQLite Database Browser
  4. 2011.10.19 아이폰 substring
  5. 2011.10.18 맥 숨긴폴더 보기
  6. 2011.10.07 [DISTINCT] 검색 시 중복값 제거
  7. 2011.10.05 Android ScrollView 위아래 흐려지는 것 방지
  8. 2011.10.05 Android Margin/Gravity 등 속성 주기 (Code)
  9. 2011.09.29 이클립스(Eclipse) Android Layout XML 코드 정렬
  10. 2011.09.29 Listview 스크롤 시 Listview가 검정색으로 변하는 경우
  11. 2011.09.29 Android 배경음악 Service로 돌리기 (1)
  12. 2011.09.29 가로모드 시 EditText가 화면을 가리는 경우
  13. 2011.09.29 [INSERT] 루프 삽입
  14. 2011.09.29 [UPDATE] 갱신문
  15. 2011.09.29 [SELECT] 문자 연산자 (LIKE, BETWEEN, IN)
  16. 2011.09.29 [SELECT] 집계 함수(집단 함수=그룹 함수) [ SUM(),AVG(),COUNT(),MAX(),MIN() ]
  17. 2011.09.29 [SELECT] 특정 컬럼의 데이터를 제외하고 검색 (WHERE)
  18. 2011.09.29 [DELETE] 컬럼값 삭제하기
  19. 2011.09.29 [SELECT] 랜덤으로 1개 집어오기
  20. 2011.09.29 [추천유틸] SQLite Expert
  21. 2011.09.29 윈도우7 오라클 설치
  22. 2011.09.29 [오류]Oracle 홈 이름이 적합하지 않습니다.
  23. 2011.09.29 [Eclipse] 대소문자 변환 단축키
  24. 2011.09.29 TextView 글 자르기 android:ellipsize
  25. 2011.09.29 dip, px 변환
  26. 2011.09.29 [Android] 현재시간 구해서 문자열로 변환
  27. 2011.09.29 [Java/Android] 시간 끌기
  28. 2011.09.29 [Java/Android] 문자형 변환 / 숫자형 변환
  29. 2011.09.29 [Java] 생성자메서드
  30. 2011.09.29 [Java] this, this(), super, super() 의 이해 (9)
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.11.07 13:43
http://sourceforge.net/projects/sqlitebrowser/files/latest/download?_test=goal

s
qlite 유틸리티입니다. 

앞서 소개한 sqlite export 보다 가벼운 프로그램입니다.

위의 경로로 가시면 받으실 수 있습니다. 

 
Posted by 그린블로그 DEV그린
2011.10.19 17:54

NSCharacterSet * set = [NSCharacterSet characterSetWithCharactersInString:@"-"];

NSString * test = @"2009-11-24";

NSLog(@"stringByTrimmingCharactersInSet:%@", [test stringByTrimmingCharactersInSet:set]);


NSLog(@"stringByPaddingToLength:%@", [test stringByPaddingToLength:4 withString:nil startingAtIndex:0]);// vb left(test, 4)

이 녀석을 이용해서 부분 문자열을 가져 올 수 있습니다.


NSLog(@"rangeOfString location:%d", [test rangeOfString:@"-"].location); // vb instr

NSLog(@"rangeOfString length:%d", [test rangeOfString:@"-"].length);

이 메소드 함수를 이용하면 문자열 내에 부분 문자열의 위치를 확인할 수 있습니다.
문자열이 존재하지 않으면 .length 의 값은 0 입니다.


NSLog(@"substringToIndex:%@", [test substringToIndex:4]);

왼쪽 4 자

NSLog(@"substringWithRange:%@", [test substringWithRange:NSMakeRange(5,2)]);

6번째(인덱스5번)부터 2자

NSLog(@"substringFromIndex:%@", [test substringFromIndex:8]);

9번째(인덱스8번)부터 끝까지


출처 : http://blog.naver.com/gikimirane?Redirect=Log&logNo=130108682495 

Posted by 그린블로그 DEV그린
2011.10.18 22:11
터미널에서

defaults write com.apple.Finder AppleShowAllFiles YES

위의 커맨드만 입력해준 후 파인더를 프로세스 종료 하고 다시 켜면

숨겨진 폴더들을 볼 수 있습니다.

이걸 해제하려면 똑같은 상황에서

defaults write com.apple.Finder AppleShowAllFiles NO 

를 입력해주시면 됩니다. 
Posted by 그린블로그 DEV그린
2011.10.07 14:02

DISTINCT 

- SELECT 절에서 검색 결과중 데이터가 중복되지 않도록 중복되는 값들을 제거한 후 보여주는 역할을 하는 속성입니다.
DISTINCT와 반대되는 ALL이 있지만 ALL은 항상 DEFAULT 로 명시되어 있어 DISTINCT를 부여하지 않으면 항상 ALL 속성의 영향을 받습니다.



예문) SELECT
DISTINCT A FROM tableName WHERE B > 80;

tableName 테이블에서 A 컬럼의 데이터명이 중복되지 않으면서 B 컬럼의 값이 80 이상인 값들만 검색합니다.



그 밖의 옵션들

DISTINCT : 검색 결과중 중복되는 값 제거
CASCADE : 연관관계까지 함께 삭제(참조 중인것도 삭제)
RESTRICT : 참조중이면 삭제 하지 않음
HAVING : 반드시 GROPU BY와 사용
ORDER BY : 정렬
ASC : 오름차순(생략시 기본 오름차순)
DESC : 내림차순

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그린
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:57
android:imeOptions="flagNoExtractUi"

속성을 넣어줍니다.

<EditText
  android:layout_width="190dp"
  android:layout_height="50dp"
  android:id="@+id/string_etext1"
  android:layout_below="@+id/string1"
  android:numeric="integer"
  android:layout_centerHorizontal="true"
  android:hint="힌트"
  android:imeOptions="actionDone|flagNoExtractUi"
  />
Posted by 그린블로그 DEV그린
2011.09.29 12:56

String[] a = ["xxx", "yyy", "ttt"];


insert();


.

.

.


public void insert(){


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


String sql ="INSERT INTO tableName (a, b) VALUES("+a[i]+")";

db.setTransactionSuccessfull();

db.endTransaction();


}


}

Posted by 그린블로그 DEV그린
2011.09.29 12:55

기억하세요! 갱신문은~ UPDATE-SET-WHERE ~!


UPDATE 테이블명 SET 열이름1=값1, 열이름2=값2... WHERE 조건


예제)


UPDATE tableName SET _id=1000 WHERE _id=7

//tableName 테이블의 _id 컬럼값 7번을 1000으로 바꿉니다.

Posted by 그린블로그 DEV그린
2011.09.29 12:54

SELECT * FROM tableName WHERE _id BETWEEN 10 AND 30

//tableName 테이블에서 _id 컬럼의 값이 10 이상, 30 이하인 레코드를 검색합니다. (~와~사이)


SELECT * FROM tableName WHERE IN(10,30)

//tableName 테이블에서 _id 컬럼의 값이 10, 30인 레코드만 검색합니다. (안에)


SELECT * FROM tableName WHERE LIKE '%hi%'

//tableName 테이블에서 a 컬럼의 값이 hi 인 레코드만 검색합니다. (같은)



PS : 

세번째 LIKE '%hi%' 에서 %는 무엇일까요? 그것은 hi 좌우의 임의 문자에 상관없이 어디에든 hi만 들어가면 검색한다는 소리입니다.

예를 들면, a 컬럼의 값이 'high' 인데 위와 같이 '%hi%' 로 검색했을 때 a 컬럼이 출력되는 모습을 확인할 수 있을겁니다.


하지만 '%hi' 로 검색한다면 a 컬럼의 값은 검색되지 않을 것입니다. hi와 high는 다른 단어로 인식하기 때문입니다. 그것을 풀어주는 것이 %입니다. 마찬가지로 a 컬럼의 값이 'ahi' 인데 'hi%' 로 검색하면 hi 뒤에 있는 %가 뒤의 단어들은 무시해줄진 몰라도 앞에는 없기 때문에 hi와 ahi를 다른 단어로 인식하는 것입니다. 

Posted by 그린블로그 DEV그린
2011.09.29 12:53

SELECT SUM(_id) FROM tableName;

// tableName 테이블에서 _id 컬럼의 데이터 합을 구합니다. (_id는 숫자)


SELECT AVG(_id) FROM tableName;

// tableName 테이블에서 _id 컬럼의 데이터의 평균을 구합니다.


SELECT COUNT(*FROM tableName;

//tableName 테이블의 개수를 셉니다. 즉, 행을 카운트합니다.


SELECT MAX(_id) FROM tableName;

//tableName 테이블에서 _id 컬럼의 데이터 중 최대값을 구합니다.


SELECT MIN(_id) FROM tableName;

//tableName 테이블에서 _id 컬럼의 데이터 중 최소값을 구합니다.




일단 예제를 들어 테이블 명이 tableName, 컬럼값이 _id 하나로 4개가 있다고 쳤을 때


SELECT * FROM tableName;


 _id

 1

 2

 3

 4 


여기서 


SELECT SUM(_id) FROM tableName;


하면 1+2+3+4 가 되서 


 _id

 10


이라는 결과가 나오겠지요. 나머지로 이런 맥락으로 생각하시면 됩니다. ^^

Posted by 그린블로그 DEV그린
2011.09.29 12:50

SELECT * FROM 테이블명 WHERE 컬럼명 !='데이터값' 

//테이블명에서 특정 컬럼의 데이터 값을 조건연산자 != 로 추려낸 후 나머지 데이터들만 검색하는 쿼리입니다.

//데이터값이 숫자면 싱글쿼트 ''가 없어도 됩니다.


SELECT * FROM 테이블명 WHERE NOT 컬럼명 ='데이터값' 

//테이블명에서 특정 컬럼의 데이터 값을 논리연산자 NOT 으로 추려낸 후 나머지 데이터들만 검색하는 쿼리입니다.


SELECT * FROM 테이블명 WHERE 컬럼명 <>'데이터값' 

//테이블명에서 특정 컬럼의 데이터 값을 비교연산자 <>로 추려낸 후 나머지 데이터들만 검색하는 쿼리입니다.





예제)


INSERT INTO tableName (abVALUES ('how are you', 'fine thanks')

INSERT INTO tableName (abVALUES ('and you?''한국어로 해라')

//테이블명 tableName에 text 컬럼값인 'a'와 'b' 가 있을 때, 두 컬럼에 값을 집어넣고


SELECT * FROM tableName WHERE a != 'how are you'

//위와 같은 구문을 통해 검색하면 'how are you' 가 들어간 곳만 빼고 검색되는 것을 알 수 있습니다. 결과는 두번째 데이터만 검색될 것 입니다,

Posted by 그린블로그 DEV그린
2011.09.29 12:49

DELETE FROM tableName WHERE _id=4


tableName 테이블의 컬럼값_id 4번을 지운다.

Posted by 그린블로그 DEV그린
2011.09.29 12:48
SELECT _id, a, b FROM tableName WHERE a like '%a에 있는 데이타%' ORDER BY RANDOM() LIMIT 1

tableName이라는 이름을 가진 테이블에서 

-id, a, b 이렇게 3개의 컬럼을 검색하는데, 

검색어가 a의 데이타 인것 중에서 랜덤으로 1개만 가져오는 쿼리입니다.
Posted by 그린블로그 DEV그린
2011.09.29 12:48

http://www.sqliteexpert.com/download.html


SQLLite Expert 유틸.


이클립스 - DDMS - File Explorer - data - data - 패키지명 - database 에서


지정한 테이블명.db 를 오른쪽 상단의 pull a file from the device 버튼을 눌러 내보낸 후


SQLLite Expert 로 불러오면 보기가 편합니다.

Posted by 그린블로그 DEV그린
2011.09.29 12:45
* 10204_vista_w2k8_x64_production_db 압축배포판 기준으로 설명합니다.

1.10204_vista_w2k8_x64_production_db\database\install 폴더안에 있는
  oraparam.ini 파일을 열어줍니다

[Certified Versions]
#You can customise error message shown for failure, provide value for CERTIFIED_VERSION_FAILURE_MESSAGE
Windows=5.0,5.1,5.2,6.0 

를 찾아서 다음과 같이 바꿔줍니다

[Certified Versions]
#You can customise error message shown for failure, provide value for CERTIFIED_VERSION_FAILURE_MESSAGE
Windows=5.0,5.1,5.2,6.0,6.1

2. 10204_vista_w2k8_x64_production_db\database\stage\prereq\db폴더 안에 있는 
  refhost.xml 파일을 열어줍니다
<CERTIFIED_SYSTEMS>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.0"/>
      <SERVICE_PACK VALUE="1"/> 
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.1"/>
      <SERVICE_PACK VALUE="1"/> 
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.2"/>
    </OPERATING_SYSTEM>
    <!--Microsoft Windows Vista-->
    <OPERATING_SYSTEM>
      <VERSION VALUE="6.0"/>
    </OPERATING_SYSTEM>
  </CERTIFIED_SYSTEMS>          를 찾아서

<CERTIFIED_SYSTEMS>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.0"/>
      <SERVICE_PACK VALUE="1"/> 
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.1"/>
      <SERVICE_PACK VALUE="1"/> 
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="5.2"/>
    </OPERATING_SYSTEM>
    <!--Microsoft Windows Vista-->
    <OPERATING_SYSTEM>
      <VERSION VALUE="6.0"/>
    </OPERATING_SYSTEM>
    <OPERATING_SYSTEM>
      <VERSION VALUE="6.1"/>
    </OPERATING_SYSTEM>
    
  </CERTIFIED_SYSTEMS>

로 바꿔줍니다

3. 10204_vista_w2k8_x64_production_db\database\stage\prereq\db_prereqs\db 폴더 안에 있는
  refhost.xml 파일을 열어줍니다  (주의 : 2번의 폴더 경로와 다릅니다 확인해주세요.)

파일을 열고 2번과 똑같이 작업해 줍니다.  

이렇게 작업하시고 다시 설치를 진행해보시면 설치 전 검사를 통과할 수 있습니다.

그런데 설치하려고 일반설치를 누르면 설치경로가 잘못됬다고 하면서 어쩌구저쩌구 됩니다.
이건 드라이브경로나 폴더명을 바꿔도 진행이 안되니

아래쪽의 고급설치로 진행하시면 됩니다. 
Posted by 그린블로그 DEV그린
2011.09.29 12:45


윈도우 7 기준

 

오라클 설치 시 위와 같이 오류 메세지가 뜰 경우 일반 설치가 아닌 고급 설치를 합니다.

Posted by 그린블로그 DEV그린
2011.09.29 12:43

간단한 단축키를 이용하여 대소문자 변환을 해줍니다.


소문자 변환 : 블럭 지정 후 ctrl + shift + Y

대문자 변환 : 블럭 지정 후 ctrl + shift + X

Posted by 그린블로그 DEV그린
2011.09.29 12:43

TextView의 글을 자르기 위해서는 일단 글을 한줄로 제한 하는 


android:singleLine="true"


속성을 줘야 한다.


android:ellipsize="end" 

글이 길면 ...으로 잘라주는 속성. 예를 들어 "가나다라마바사" 가 "가나다..." 가 되는 속성이다.


android:ellipsize="marquee"

웹의 마퀴 태그와 같이 글자가 흐르게 보여주는 속성. 효과를 주려면 코드에


textview.setSelected(true); 


이렇게 주어야 한다.


<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:ellipsize="end"

 />


 ps : 보라색 색상 코드 : #7F007F

        녹색 색상 코드 : #3F7F7F

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그린
2011.09.29 12:39
Calendar cal = Calendar.getInstance();

String dateToString timeToString ;

dateToString = String.format("%04d-%02d-%02d", cal.get(Calendar.YEAR), cal.get(Calendar.MONTH) + 1, cal.get(Calendar.DAY_OF_MONTH));

timeToString = String.format("%02d:%02d:%02d", cal.get(Calendar.HOUR_OF_DAY), cal.get(Calendar.MINUTE), cal.get(Calendar.SECOND));

Log.i("INFO""Date&Time : "+dateToString +", "+timeToString);

-----------------------------------------------------------------------

이렇게 하면 

dateToString의 값은 "YYYY-MM-DD" 로, 
timeToString의 값은 "HH:mm:ss" 로 변환됩니다.
Posted by 그린블로그 DEV그린
2011.09.29 12:38

시간 끌기 1번


     for(int i=0; i<100000; i++){

     Log.i("test", ""+i);

     }


시간 끌기 2번


     try {

Thread.sleep(4000);

} catch (InterruptedException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

Posted by 그린블로그 DEV그린
2011.09.29 12:37

1. 숫자(Int)를 문자(String)형으로 변환하는 방법


int number = 1; 

//숫자형 변수 number의 값을 1로 선언


String IntToString Integer.toString(number); 

//String 변수 IntToString를 선언하여 number 변수의 1값을 String 값 "1" 로 바꿈.

String IntToString = String.valueOf(number); 

//다른 방법.


2. 문자(String)를 숫자(Int)형으로 변환하는 방법


String char "1000"; 

//숫자형 변수 char의 값을 "1000" 으로 선언


int StringToInt Integer.parseInt(char); 

//String 수 StringToInt를 선언하여 char 변수의 "1000"값을 int 값 1000 으로 바꿈.

Posted by 그린블로그 DEV그린
2011.09.29 12:36

4.2 생성자메서드

4.2.1 생성자메서드

생성자메서드란 클래스를 이용하여 메모리를 가진 instance 즉, 객체를 생성할 때 제일 먼저 호출되는 메서드입니다.

 

생성자메서드의 정의

n        객체를 생성과 동시에 기본적으로 호출 되어지는 메서드

 

여러분은 이미 생성자메서드를 사용하고 있었습니다. 생성자메서드를 여러분이 따로 만들지 않는다면 여러분이 만든 클래스에서 자동으로 디폴트생성자가 만들어지게 됩니다. 앞 절의 예제에서 우리는 다음과 같은 구문을 사용했습니다.

 

MainTest.java(디폴트 생성자메서드를 위한 예제)

public class MainTest{

             public void sayHello(){

                           System.out.println("Hello World!");

             }

 

             public static void main(String[] args){

                           MainTest m = new Ma inTest();

                           m.sayHello();

             }

}

MainTest()라는 메서드는 없습니다. 만들지도 않았죠. 이 때 여러분이 생성자메서드라하여 클래스의 이름과 같은 메서드를 만들지 않는다면 자바에서 기본적으로 디폴트 생성자라는 것이 만들어지는데 이 디폴트 생성자가 바로 MainTest()입니다. 메모리가 생성된 직후 가장 먼저 호출되는 메서드입니다. 물론 현재의 디폴트 생성자는 하는 일이 없습니다. 단지 생성자라고 표시만 할 뿐입니다.

 

, 클래스를 만들 때 사용자가 따로 생성자를 만들지 않는다면 매개변수가 없는 디폴트 생성자메서드 “MainTest()”가 만들어져서 사용되며, 디폴트 생성자메서드를 여러분이 약간 변형하여 만들거나 아니면 매개변수가 있는 생성자메서드를 다시 만든다면 기존의 디폴트 생성자메서드는 없어지고 새로운 생성자가 만들어지는 것입니다.

 

 

4.2.2 생성자메서드의 특징

  생성자메서드는 유일하게 리턴타입이 없는 메서드입니다. 그리고 생성자메서드의 이름은 클래스의 이름과 동일하며 일반적으로 초기화나 멤버의 기본값 할당을 위해 사용됩니다. 보통의 경우 클래스 작업을 할 때 제일 먼저 프로그램해야 하는 것들을 생성자메서드 내에 프로그램하게 됩니다.

 

생성자메서드의 특징

n        메서드의 리턴타입이 없다.

n        메서드의 이름은 클래스의 이름과 동일하다.

n        new생성자가 메모리를 생성한 직후 호출 되어진다.

 

생성자메서드는 new연산자와 함께 사용되는데 new연산자가 메모리를 생성하고 나면 멤버 변수들이 메모리를 할당 받게 됩니다. 멤버 변수들이 메모리가 존재하기 때문에 멤버필드에 값을 할당하거나 초기화를 할 수 있습니다. 이때 생성자 메서드가 활동을 하는 것입니다. 보통은 멤버필드의 초기화를 주로하지만 필요하다면 객체의 생성과 동시에 해 주어야 하는 작업들을 이 생성자메서드에서 하게 됩니다. 생성자가 없는 클래스에 대하여 컴파일러는 인수 리스트를 가지지 않는 생성자메서드를 자동으로 제공합니다. 이 생성자를 우리는 디폴트 생성자라고 부릅니다.

 

생성자의 역할은 초기화 작업이라고 했습니다. 생성자에 관련된 예제를 하나 만들어 보도록 하죠.

 

ConstructTest.java(생성자메서드를 위한 예제)

public class ConstructTest {

             private String name = null;

             private String address = null;

             private int age = 0;

             public ConstructTest(){

                           name = "이름없음";

                           address="주소없음";

                           age=0;

             }

             public void setList(String sname, String saddress, int sage){

                           name = sname;

                           address = saddress;

                           age = sage;

             }

             public String getList(){

                           String str = name + "  " + address + "   " + age;

                           return str;

             }

             public static void main(String[] args) {

                           ConstructTest ct = new ConstructTest();

                           String s;

                           s = ct.getList();

                           System.out.println(s);

 

                           ct.setList("홍길동", "서울시 중구", 25);

                           s = ct.getList();

                           System.out.println(s);

             }

}

C:\examples\4. Class for Basic Java>java ConstructTest

이름없음  주소없음   0

홍길동  서울시 중구   25

 

생성자메서드에서 값을 name, address, age 멤버필드에 할당하고 있습니다. 그렇기 때문에 객체를 생성한 직후 바로 getList멤버메서드를 호출 했을 때 생성자메서드에서 초기화 한 값을 얻을 수 있습니다. 다시 setList메서드를 통해서 값을 할당한 이후에는 바뀌겠죠. 이렇게 생성자에서 우선적으로 값을 할당해야 할 경우가 있다면 생성자메서드를 이용하면 아주 편하게 해결할 수 있습니다.

 

생성자메서드도 매개변수를 이용하여 외부로부터 직접 생성자메서드에 값을 할당하는 방법으로 멤버필드를 초기화 할 수 도 있습니다. 그 예를 살펴 보기로 하죠.

 

ConstructDirect.java(생성자메서드를 위한 예제)

public class ConstructDirect{

             private String name = null;

             private String address = null;

             private int age = 0;

             public ConstructDirect(String sname, String saddress, int sage){

                           name = sname;

                           address = saddress;

                           age = sage;

             }

             public void setList(String sname, String saddress, int sage){

                           name = sname;

                           address = saddress;

                           age = sage;

             }

             public String getList(){

                           String str = name + "  " + address + "   " + age;

                           return str;

             }

             public static void main(String[] args) {

                           ConstructDirect ct = new ConstructDirect("홍길동", "서울시 중구", 25);

                           String s;

                           s = ct.getList();

                           System.out.println(s);

             }

}

C:\examples\4. Class for Basic Java>javac ConstructDirect.java

 

C:\examples\4. Class for Basic Java>java ConstructDirect

홍길동  서울시 중구   25

 

우리는 이 예제에서 생성자에서 매개변수를 사용하는 방법을 쉽게 볼 수 있습니다. 만약 여러분이 이 예제처럼 매개변수가 있는 생성자메서드를 만들었다면 디폴트 생성자는 더 이상 사용할 수 없습니다. 그리고 반드시 생성자메서드를 사용될 때 매개변수의 개수와 형을 맞추어 주어야 합니다. 메서드는 매개변수의 개수와 매개변수의 형에 목숨을 걸고 있습니다. 그리고 생성자메서드에는 리턴타입이 없기 때문에 당연히 리턴이라는 것이 없습니다. 다른 일반 메서드 또한 리턴타입과 리턴값은 반드시 지켜야 합니다.

 

 

4.2.3 결론

 생성자메서드는 말 그대로 생성될 때 호출 되는 메서드입니다. 그 유용함은 객체 생성순간에 같이 호출 될 수 있다는 장점이 있습니다. 이 생성자를 아주 유용하게 사용하면 편리한점 뿐만 아니라 반드시 필요한 메서드입니다. 물론 그것은 아주 미세한 것이지만 이렇게 생각 해 볼 수 있습니다. 만약 인간이라는 데이터 타입으로 아기를 만든다고 생각 해 보십시오. 아기는 어느 정도 초기화는 되어 있어야 합니다. 눈, 코, 입, 팔, 다리등 필수적인 요소들은 전부 초기화 되어 있어야 합니다. 이러한 면에서 본다면 생성순간에 해 주어야 하는 일은 아주 중요한 일입니다. 만약 이것을 잘못하게 되면 아마 여러분들이 만든 객체는 이상한 괴짜 객체가 되고 말 것입니다.

 

출처 소설같은자바

Posted by 그린블로그 DEV그린
2011.09.29 12:34

this 와 this() 는 다르구요, super와 super() 역시 다릅니다.


this 는 현재 클래스의 인스턴스, 그러니까 지금 실행상태에 있는 인스턴스의 특정 필드를 지정할때 사용합니다.



 class Test {


 int age;

 public void setAge(int age){

 this.age = age;

       }
 }



머 이렇다구 치구... 다른 객체에서 

Test test = new Test();

test.setAge(20);

이라고 하면 위에있는 setAge(int); 메소드가 작동을 하겠죠...

setAge(int age); 메소드를 보면 파라미터로 전달된 int 의 이름인 age와 Test 클래스의 필드값이 age가 같은 이름이거든요...

이럴때 this. 를 붙여주면 

this.age

는 "이 age는 지금 메소드(setAge)의 파라미터인 age 값이 아니라 클래스의 필드인 age다" 라는걸 나타냅니다. (헷갈리지 않게..)

그리고 두번째로는 뭐랄까... 강조하는 의미에서 사용하는 경우도 있습니다.

this.name = "용가리";

라고 하면 여기서 name 은 클래스의 필드라는것을 명확하게 나타냅니다. 위 문장이 메소드안에 존재하더라도 name 은 클래스의 필드임을 확실히 해두기 위해서 사용됩니다.


this(); 는 생성자를 부르기 위해서 사용되거든요..


 class Person{


 int age;
 String name;
 String address;

 public Person(){
 this(0, null, null);
 }

 public Person(int age){
 this(age, null, null);
 }

 public Person(int age, String name){
 this(age, name, null);
 }

 public Person(int age, String name, String address){
 this.age age;
 this.name name;
 this.addressaddress;
     }
 }


한사람에 대한 나이, 이름, 주소를 저장하는 클래스인데 생성자를 함 잘 살펴보세요.

점차 파라미터(넘겨받는 값)가 늘어나고 있죠...

다른 클래스에서

Person jane = new Person(23, "jane", "America");
Person jane = new Person(23, "jane");
Person jane = new Person(23);
Person jane = new Person();

위와같이 다양한 방법으로 인스턴스를 생성할 수 있도록 여러종류의 생성자를 마련했을때 this(); 가 유용하게 쓰일 수 있습니다.

생성자끼리도 서로가 서로를 호출할 수 있는(객체지향 프로그래밍에서는 메시지를 전달한다고 하는데 그냥 편하게 호출한다고 할께요..) 방법이 바로 this() 를 활용하는 겁니다. 

위에서 두번째, 세번째, 네번째 모두 결국은 첫번째 생성자

Person jane = new Person(23, "jane", "America");

를 호출해서 인스턴스를 만들거든요.... 뭐 이런식으로 쓰인다고만 아시면 되겠습니다.

같은 방식으로 super(); 는 현재 자식클래스가 자신을 생성할때 부모 클래스의 생성자를 불러서 함 초기화 해주고나서 자신을 초기화하는 것입니당.

class A extends B

라고 하면 클래스 B는 A의 부모 클래스죠.

A 를 생성한다고 하면 우선 B를 생성해야 합니다. 왜냐하면 A는 B를 상속하므로 A를 완전하게 만들려면 B부터 만들어야 하거든요. ^^;;(부모없이 자식이 존재할 수 없는것과 같습니다.)

class B{

public void setAge(int age)
{
...
}

}

class A extends B {

public void setAge(int age)
{
...
}

}

이렇다고 하면 

A a = new A();

로 인스턴스를 만들면 그냥 A 가 만들어지는게 아니라 

1. A 를 만들기 위해서 A의 생성자를 찾아간다.
2. 가서 보니까 A가 B를 확장하고 있네...
3. 그럼 B부터 만들어야겠군...
4. 그럼 B의 생성자를 찾아가야지..
5. B를 만들었으니..
6. 이제 A를 만들자.
7. 다 만들었다!!!

이렇게 됩니다. ^^;;

위에서 클래스 B를 

class B{

public B (int a){
;
}
}

로 하믄 어떤일이 벌어질까요..

에러가 발생합니다. 왜냐하면 3번에서부터 문제가 발생합니다.

3. 그럼 B부터 만들어야겠군...
4. 그럼 B의 생성자를 찾아가야지..
5. 헉! 알맞는 B의 생성자가 없다
6. 에러다!

왜 없다고 하나면 A 클래스에 대한 생성자가 없으니까 디폴트로

public A() { ; }

와같이 생성자를 만듭니다.

그런데 B에서는 int 값을 전달받는 생성자를 명시적으로 적어줬으니 

public B() { ; }

이런 생성자가 없게 됩니다.(필요하다면 적어줘야함)

A 가 B 를 상속하니까 B를 만들어야 되는데 A의 생성자에서 명시적으로 B의 생성자를 적어주지 않았으므로 역시 디폴트로 

super();

를 부릅니다. super(); 를 부른다는 것은 부모 클래스의 

public B(){;}

를 실행하라는 말입니다. 그런데 저런 생성자가 없으니 에러가 납니다.

이럴때는 A에서 

class A extends B {

public A(){
super(20);
}

}

요렇게 부모 클래스의 생성자를 불러주면 잘 작동합니당. ^^;;;

이게 바로 super(); 의 쓰임새입니당..^^;;


super는 뻔하겠죠. 부모클래스의 필드값이나 메소드를 직접 부를 때 붙여넣는 겁니다.

위에서 A나 B나 둘다 모두 setAge(int); 메소드가 있습니다. 자식 클래스인 B에서 부모클래스 A의 setAge(int); 메소드를 부를 일이 생겼다고 치죠. B에서 그냥

setAge(20);

을 부르면 B 클래스에 있는 메소드를 부르게 됩니다. B 클래스에 setAge(int) 메소드가 없었다면 부모 클래스에 있는지 자동으로 찾아보게 됩니다.

하지만 B에는 setAge(int) 가 있으므로 부모 클래스의 setAge(int) 를 찾지 않고 B의 메소드를 사용하게 됩니다.

우리가 원하는 것은 부모클래스의 setAge(20) 을 부르고 싶기 때문에

super.setAge(20);

을 해야 합니다. super 는 "나에게 있는 메소드나 필드를 찾지 말고 내 부모 클래스에 있는 필드나 메소드를 사용해라" 라는 의미로 붙여주는 예약어입니다.




 
수타~면~
Posted by 그린블로그 DEV그린