안드로이드 View 클래스 관련 깨알같은 스펙정보

Posted by ironmask84
2016. 1. 21. 16:47 나는 프로그래머다!/Java & Android


setContentView() : 화면에 무엇을 보여줄지를 결정하는 함수(메소드)

R.layout.activity_main : 화면에 보여줄 대상이 되는 화면의 설정파일(xml)을 지정하는 구문

@string/hell_world  : activity_xxx.xml파일을 작성 할때 values/strings.xml 파일에 id가 hello_world로 설정된 문자열을 지정하는 구문 - android:text="@string/hello_world"

@+id/button01 : activity_xxx.xml파일 안에 있는 태그의 id를 지정하는 방식. 구성요소들을 화면상에 배치하기 위해 layout_below등의 값으로 지정할때 사용

findViewById() : xml에서 정의한 태그의 id를 이용해 코드에서 객체를 참조하는 방식

Intent : 어떤 기능을 실행할 지를 지정하기 위해 사용

Toast : 화면에 잠깐 보였다가 사라지는 풍선 메시지 사용을 위한 객체


 크기를 지정 할때 사용되는 단위들

 단 위

 단위 표현

 설 명

 px

 필셀

 화면 필셀

 dp or dip

 밀도 독립적 픽셀(density independent pixel)

 160dip 화면을 기준으로 한 픽셀

예) 1이치당 160개의 점이 있는 디스플레이 화면에서 1dp는 1px와 같음, 1인치당 320개의 점이 있는 디스플레이 화면에서 1dp는 2px와 같음

 sp or sip

 축척 독립적 픽셀(scale independent pixel)

 가변 글꼴을 기준으로 한 픽셀로 dp와 유사하나 글꼴의 설정에 따라 달라짐

 텍스트 표현시 폰트 크기대로 뷰를 표시할때 일반적으로 사용.

 in

 인치

 1인치로 된 물리적 길이

 mm

 밀리미터

 1밀리미터로 된 물리적 길이

 em

 텍스트 크기

 글꼴과 상관없이 동일한 텍스트 크기 표시

!!! 실제 앱의 화면을 구성 할 때는 'dp'단위를 주로 사용한다고 한다. 안드로이드 단말은 다양한 화면 크기와 해상도를 가지고 있는데 'dp'단위를 사용하면 단말의 해상도에 따라 비율로 픽셀값이 계산되므로 대부분의 화면에서 비슷한 크기로 보이도록 만들 수 있기 때문이다.


Color Format : ARGB( A: Alpha, R: Red, G : Green, B : Blue) - 

Alpha값 : 투명도 조절에 사용  - FF(불투명) -> 88(반투명) -> 00(투명)

textColor 속성 : 텍스트뷰에서 표시하는 문자열의 색상 속성 - ARGB 값으로 지정 - #88FF00FF

textSize 속성 : 텍스트뷰에서 표시하는 문자열의 크기 속성 - 12dp or 12sp or 12px

textStyle 속성 : 텍스트뷰에서 표시하는 문자열의 스타일 속성 - normal, bold, italic, bolditalic

typeFace 속성 : 텍스트뷰에서 표시하는 문자열의 폰트 설정 속성 - normal, sans, serif, monospace

singleLine 속성 : 텍스트뷰에서 표시하는 문자열이 한줄로 표시되도록 설정하는 속성.


배경 이미지 지정 : android:background="@drawable/pretty"

               res/drawable-hdpi 폴더에 pretty.png 파일을 위치시킨다. 폴더명의 hdpi 부분은 기기별 dpi에 따라 다른 해상도의 이미지를 지정해주기 위함인가?


orientation : 뷰를 추가하는 방향을 설정하는 속성 ( LinearLayout에만 적용되는 속성 )

gravity : 뷰의 정렬 방향을 설정하는 속성

padding : 뷰의 여유공간을 설정하는 속성

weight : 뷰가 차지하는 공간의 가중치 값을 설정하는 속성


레이아웃 종류 

@string/hell_world  : activity_xxx.xml파일을 작성 할때 values/strings.xml 파일에 id가 hello_world로 설정된 문자열을 지정하는 구문 - android:text="@string/hello_world"

 레이아웃 이름

 설 명

 LinearLayout

 - 박스(Box) 모델( 특정 방향으로 뷰들을 나열하듯 배치 )

 - 사각형 영역들을 이용해 화면을 구성하는 방법

 - 표준 자바의 BoxLayout과 유사

 RelativeLayout

 - 규칙(Rule) 기반 모델

 - 부모 컨테이너나 다른 뷰와의 상대적 위치를 이용해 화면을 구성하는 방법

 FrameLayout

 - 기본 단위 모델

 - 하나의 뷰만 보여주는 방법

 - 가장 단순하지만 여러 개의 뷰를 추가하는 경우 중첩시킬 수 있으므로 뷰를 중첩한 후 각 뷰를 전환하여 보여주는 방식으로 사용할 때 유용함.

 TableLayout

 - 격자(Grid) 모델

 - 격자 모양의 배열을 이용하여 화면을 구성하는 방법

 - HTML에서 많이 사용하는 정렬 방식과 유사하여 실용적임

 ScrollView

 - 스크롤이 가능한 컨테이너

 - 뷰 또는 뷰그룹이 들어갈 수 있으며 화면 영역을 넘어갈 때 스크롤 기능 제공

 



앱의 실행시 보여지는 첫번째 화면을 바꾸려면 아래의 AndroidManifest.xml 파일에서 볼드폰트로 표시된 부분을 타겟 액티비티 이름으로 변경해주면 된다.

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"?
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".NewActivity"></activity>
        <activity android:name=".LinearLayoutActivity"></activity>
        <activity android:name=".SampleLayoutCodeActivity"></activity>
        <activity android:name=".RelativeLayoutActivity"></activity>
    </application>


layout_width, layout_height 속성값

match_parent : 부모컨테이너와 같은 크기로 보이기(여유공간 모두 사용),  프로요(2.2) 버전 이전에는 fill_parent로 사용되었음.

wrap_content : 뷰에 표시할 내용물의 크기에 따라 뷰의 크기가 결정됨.

수치값 : dp등의 수치값으로 지정할 수 있음.


layout_gravity : 부모 컨테이너의 공간에서 뷰가 표시될 위치를 지정할 때 사용되는 속성.

gravity : 뷰가 표현해야 할 내용을 뷰의 공간 내에서의 정렬을 설정하는 속성.

gravity 속성값들

 정렬 속성값

 설 명

 top

 위쪽 끝에 배치

 bottom

 아래쪽 끝에 배치

 left

 왼쪽 끝에 배치

 right

 오른쪽 끝에 배치

 center_vertical

 수직방향의 중앙에 배치

 center_horizontal

 수평방향의 중앙에 배치

 fill_vertical

 수직 방향으로 여유공간만큼 확대하여 채우기

 fill_horizontal

 수평 방향으로 여유공간만큼 확대하여 채우기

 center

 수직/수평 방향의 중앙에 배치

 fill

 수직,수평 방향의 여유공간만큼 확대

 clip_vertical

 - 대상 객체의 상하 길이가 여유공간보다 클 경우에 남는 부분을 잘라내기

 - top|clip_vertical로 설정한 경우 아래쪽에 남는 부분 잘라내기

 - bottom|clip_vertical 로 설정한 경우 위쪽에 남는 부분을 잘라내기

 - center_vertical|clip_vertical 로 설정한 경우 위쪽과 아래쪽에 남는 부분 잘라내기

 clip_horizontal

 - 대상 객체의 좌우 길이가 여유 공간보다 클 경우에 남는 부분을 잘라내기

 - right|clip_horizontal 로 설정한 경우 왼쪽에 남는 부분 잘라내기

 - left|clip_horizontal 로 설정한 경우 오른쪽에 남는 부분 잘라내기

 - center_horizontal|clip_horizontal 로 설정한 경우 왼쪽과 오른쪽에 남는 부분 잘라내기

 



baselineAligned : layout_gravity나 gravity 속성만으로 정렬에 어려움이 있을 경우를 위해 지원되는 속성이며 레이아웃에 추가되는 뷰들의 텍스트들의 아랫줄 맞추기 한다.

                         android:baselineAligned="true"


상대 레이아웃에서 부모 컨테이너와의 상대적 위치를 이용해 뷰를 배치할 수 있는 속성들 

 속성

 설명

 layout_alignParentTop

 부모 컨테이너의 위쪽과 뷰의 위쪽을 맞춤

 layout_alignParentBottom

 부모 컨테이너의 아래쪽과 뷰의 아래쪽을 맞춤

 layout_alignParentLeft

 부모 컨테이너의 왼쪽 끝과 뷰의 왼쪽 끝을 맞춤

 layout_alignParentRight

 부모 컨테이너의 오른쪽 끝과 뷰의 오른쪽 끝을 맞춤

 layout_centerHorizontal

 부모 컨테이너의 수평 방향 중앙에 배치함

 layout_centerVertical

 부모 컨테이너의 수직 방향 중앙에 배치함

 layout_centerInParent

 부모 컨테이너의 수평과 수직 방향 중앙에 배치함

 


상대 레이아웃에서 다른 뷰와의 상대적 위치를 이용하는 속성들

 속성

 설명

 layout_above

 지정한 뷰의 위쪽에 배치함

 layout_below

 지정한 뷰의 아래쪽에 배치함

 layout_toLeftOf

 지정한 뷰의 왼쪽에 배치함

 layout_toRightOf

 지정한 뷰의 오른쪽에 배치함

 layout_alignTop

 지정한 뷰의 위쪽과 맞춤

 layout_alignBottom

 지정한 뷰의 아래쪽과 맞춤

 layout_alignLeft

 지정한 뷰의 왼쪽과 맞춤

 layout_alignRight

 지정한 뷰의 오른쪽과 맞춤

 layout_alignBaseline

 지정한 뷰와 내용물의 아래쪽 기준선(baseline)을 맞춤 

 

EditText InputType 속성값들 

 속성 값 EditText에 입력 가능한 값  설명 
 none  모든 문자, 모든 기호 ,숫자  다른 톡징이 없는 기본 EditText. 입력 폼안에 줄 바꿈이 가능하다.
 text  none과 같으나 줄바꿈이 불가능.
 textCapCharacters  모든 입력된 영문이 대문자로 입력이 된다.
 textCapWords  단어의 첫번째 영문이 대문자로 입력된다.
 textCapSentences  문장의 첫번째 영문이 대문자로 입력.
 textAutoCorrect  입력된 단어를 올바른 단어로 수정할 수 있다.
 textAutoComplete  단어를 입력중에 완성된 단어를 표시 할 수 있다. 
 textMultiLine  입력 폼에 줄 바꿈이 가능하나 따로 설정하지 않으면 단일 줄의 텍스트로 제한됨.
 textImeMultiLine  여러줄의 텍스트 입력가능. 키보드에 줄바꿈 키가 표시됨.
 textNoSuggestions  입력할때 사전에 등록되어있는 어떤 단어도 표시하지 않는다.
 textUri  URI를 입력.
 textEmailAddress  이메일 주소를 입력.
 textEmailSubject  이메일의 제목을 입력.
 textShortMessage  짧은 메시지를 입력.
 textLongMessage  긴 메시지를 입력.
 textPersonName  사람 이름을 입력.
 textPostalAddress  주소의 우편번호를 입력.
 textPassword  비밀번호를 입력. 입력된 문자는 (*)로 표시.
 textVisiblePassword  비밀번호를 입력. 입력된 문자가 보인다.
 textWebEditText  텍스트를 입력. 웹 양식으로 제공된다.
 textFilter  다른 텍스트를 필터링 하기 위한 문자를 입력.
 textPhonetic  발음되는 발음문자를 입력.
 textWebEmailAddress  이메일 주소를 입력. 웹 양식으로 제공.
 textWebPassword  비밀번호를 입력. 웹 양식으로 제공.
 number  숫자  숫자를 입력 받는다.
 numberSigned  숫자  부호가 있는 숫자를 입력.
 numberDecimal  .(점) 기호, 숫자  소숫점이 있는 소수를 입력 받는다.
 numberPassword  숫자  숫자로 된 패스워드를 입력.
 phone  - 기호, 숫자  전화번호를 입력 받는다.
 datetime  -, : 기호, 숫자  날짜와 시간을 입력. 날짜는 -, 시간은 :로 구분.
 date  - 기호, 숫자  날짜를 입력.
 time  : 기호, 숫자   시간을 입력.



ImageVew의 Scaltype 속성

1. matrix(원본 그대로)
2. center(가운데 정렬)
3. centerCrop(비율을 유지하며 가운데를 중심으로 자른다.)
4. centerInside(비율을 유지하며 줄어듬)
5. fitStart(왼쪽 위 정렬/ 비율유지)
6. fitCenter(centerInside와 동일)
7. fitEnd(왼쪽 아래 정렬 / 비율유지)
8. fitXY(늘이기 ImageView를 비율에 상관없이 다 채웁니다.)

속성값 java 설명
matrix setScaleType(ImageView.ScaleType.MATRIX) 원본 크기 그대로 보여줌 (왼쪽 상단 정렬)
Center setScaleType(ImageView.ScaleType.CENTER) 원본 크기 그대로 보여줌 (가운데정렬)
centerCrop setScaleType(ImageView.ScaleType.CENTER_CROP) View 영역에 공백이 있으면 채워서 보여줌(비율유지)
centerInside setScaleType(ImageView.ScaleType.CENTER_INSIDE) View 영역을 벗어나면 맞춰서 보여줌(비율유지)
fitStart setScaleType(ImageView.ScaleType.FIT_START) View 영역에 맞게 보여줌 (왼쪽상단 정렬비율유지)
fitCenter setScaleType(ImageView.ScaleType.FIT_CENTER) View 영역에 맞게 보여줌 (가운데정렬비율유지)
fitEnd setScaleType(ImageView.ScaleType.FIT_END) View 영역에 맞게 보여줌 (왼쪽하단 정렬비율유지)
fitXY setScaleType(ImageView.ScaleType.FIT_XY) View 영역을 가득 채워서 보여줌(비율유지 안함)


TextView & EditText 기능들

EditText 의 selectAllOnFocus 속성 : 아래와 같이 이 값을 true로 설정하면 포커스를 받을때 문자열 전체가 선택된다.

                                 android:selectAllOnFocus="true"

EditText 의 cursorVisible 속성 : 이 속성 값을 false로 설정하면 커서가 보이지 않게 된다.

getSelectionStart() : 선택된 문자열의 시작 위치 얻기

getSelectionEnd() : 선택된 문자열의 끝 위치 얻기

setSelection() : 문자열중에서 선택영역을 지정하기

extendSelection() : 선택영역 확장하기

selectAll() : 전체 문자열 선택하기


자동링크 : autoLink - 이 속성은 문자열에 들어 있는 링크 정보를 자동으로 찾아 링크 색상으로 표시하고 클릭하면 필요한 기능을 수행하도록 한다.

                              이메일, 전화번호, 웹링크등..


줄 간격 조정

lineSpacingMultiplier 속성 : 줄 간격을 배수로 설정 - 1.0보다 작으면 기본 설정값보다 더 좁게 보인다.

lineSpacingExtra 속성 : 여유값으로 설정 - 줄 간격 설정에 주로 사용되며 빼곡한 문자열의 가독성을 높이기 위한 것이다.


대소문자 표시

capitalize 속성 : 대문자나 소문자로 바꾸어 표시하는 기능이며, characters, words, sentences 값을 사용 할 수 있고 이는 1문자, 단어, 문장 단위로

                       맨 앞 글자를 대문자로 표시해 준다.


줄임 표

- TextView의 텍스트가 한줄로 되어 있는데 범위를 넘어가는 경우에 뒷부분은 '...'로 표시된다.

ellipsize 속성 : 범위를 넘어가는 텍스트에 대해 어디를 잘라서 표시할 것인지 설정하는 속성이다.

                 default 값 : none - 뒷부분을 자른다.

                 start, middle, end : 각각 앞부분, 중간부분, 뒷부분을 잘라서 보여준다.

singleLine 속성 : 텍스트 뷰를 한줄로 표시한다.


힌트 표시

hint 속성 : EditText에 어떤 내용을 입력하라고 안내문구를 표시하고자 할때 사용한다. 입력값이 없을때만 표시된다.

textColorHint 속성 : hint 문구의 색상을 지정한다.


편집 제한

editable 속성 : EditText에 입력되어 있는 문자열을 편집하지 못하게 하고 싶다면 이 속성값을 false로 한다. 기본값은 true.


EditText의 입력 문자열 변경 처리

getText() : 입렫된 문자열을 얻기 위해 Editable 객체를 얻는다. toString()메소드로 일반 String타입의 문자열을 얻을수 있다.

TextChangedListener() : 입력 될때마다 문자열을 확인하고 싶을때 사용한다.

addTextChangedListener() : 텍스트가 변경될 때마다 발생하는 이벤트를 처리할 수 있는 TextWatcher객체를 설정 할 수 있다.

TextWatcher 인터페이스의 메소스들

      public void beforeTextChanged(CharSequence s, int start, int count, int after)

      public void afterTextChanged(Editable s)

      public void onTextChanged(CharSequence s, int start, int before, int count)


출처 : http://blog.naver.com/dalmagru?Redirect=Log&logNo=220257843965

 

안드로이드 App Flag_Activity 란?

Posted by ironmask84
2016. 1. 21. 11:27 나는 프로그래머다!/Java & Android


안드로이드 App을 개발에서 Activity는 필수적인 클래스입니다.

Activity를 상속받아서, Form 하나의 UI부 및 제어부를 구성합니다.


디폴트로 제공하는 유용한 CallBack 함수들도 (oncreate, onstart, ondestroy... 등) 유용합니다.


이 Activity를 구성해서 만들어보면, 어떻게 다른 Activity 혹은 다른 App의 Activity로 이동할 수 있을까?

하고 생각하게 되는데, 이를 처리해주는 것이 "Intent" 라는 클래스 입니다.

(안드로이드 App에 대해 어느정도 공부를 하신 분들은 Acticity, Intent, Service, BroadcastReceiver 클래스에 익숙하실 것입니다.)


자, 그럼 "Intent"를 통해서 "Activity"라는 Form을 왔다갔다 이동한다는 것은 알겠는데,
계속해서 왔다갔다 이동을 하게 되면, 이 Form들이 Stack에 어떻게 쌓이게 될까??

이에 대해서 알아보려고 합니다.


잘 정리된 블로그의 내용이 있어서 퍼왔습니다.. ^^;;


<안드로이드는 굉장히 유용한 FLAG_ACTIVITY 들을 제공합니다.>

일반적인 경우, 안드로이드 용 어플리케이션을 작성하게 되면 여러가지 Activity 들을 생성하게 됩니다. 
이때, 가장 골치가 아픈 일 중 하나는 바로 Activity 와 Activity 간의 Flow 를 설계하고 이를 적절하게 구현하는 일입니다. 
(특히 안드로이드를 사용해보지도 않은 UX 팀과 함께 일하게 되는 경우라면 더욱 그러합니다...)

 기본적으로 안드로이드 플랫폼 상에서 Activity 는 또 다른 Activity 를 시작할 수 있고, 각각의 Activity 는 차곡 차곡 Task 라고 
불리우는 Activity Stack 에 쌓이게 됩니다. 사용자는 일반적으로 Back 버튼을 이용해서 현재 화면상에 보이는 Activity 를 
종료 시키고, 바로 직전에 사용된 Activity 로 돌아갈 수 있습니다. 안드로이드 펍의 회색님의 말을 빌리자면, 
인터넷 브라우저를 통해 웹페이지를 검색하는 것과 유사한 방식입니다. 

 하지만 이러한 방법만으로는 효과적인 UX Flow 를 구축하는데 어려움이있습니다. 
다행히, 구글에서는 Activity 를 호출할 때 사용되는 Intent 에 적절한 플래그 값을 설정해서 Activity Stack 을 제어할 수 있는 방법을 
제공해 줍니다. 이 플래그들은  FLAG_ACTIVITY 라는 접두어를 갖고 있는데, 종류가 다양해 헷갈리는 수도 있는데, 
개인적으로 제가 가장 요긴하게 사용하고 있는 FLAG_ACTIVITY 네 가지를 소개해 봅니다. 

 먼저 FLAG_ACTIVITY_SINGLE_TOP 입니다. 우선 간단하게 그림으로 표현해 보았습니다. 
A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 
B 라는 Activity 는 다시 자기 자신인 B 를 호출 하는 경우라고 가정해 보겠습니다. 
< FLAG_ACTIVITY_SINGLE_TOP >

 호출하는 Activity B 가 이미 Task 의 가장 앞에 위치하는 경우, 또 하나의 B 를 생성하는 대신, 기존에 존재하는 B Activity 가 
재활용됩니다. 이 때 B 가 재활용된다는 것을 개발자가 알아채고 새롭게 전달되는 Intent 를 사용할 수 있도록 B Activity 의 
onPause() / onNewIntent() / onResume() 가 순차적으로 호출됩니다. 별 생각없이 동일한 Activity 를 여러번 생성하는 것은 
메모리 사용량과 Activity 시작 속도 양쪽 모두에 악영향을 끼칠 수 있습니다. (특히 이미지가 덕지덕지 붙어 있는 Activity 라면). 
이런 경우 FLAG_ACTIVITY_SINGLE_TOP 를 적절하게 활용하면 제법 큰 효과를 볼 수 있습니다.

 두 번째는, FLAG_ACTIVITY_NO_HISTORY 플래그입니다. 우선 간단하게 그림으로 표현해 보았습니다. A 와 B  두 가지 Activity 가 있는 데, A 라는 Activity 는 B 를 B 라는 Activity 는 A 를 호출한 후 에 (A->B->A) 사용자가 Back 키를 누르는 경우를 가정해 보겠습니다.
<FLAG_ACTIVITY_NO_HISTORY>

 말 그대로, FLAG_ACTIVITY_NO_HISTORY 로 설정된 Intent 로 시작된 Activity B 는 Task 에 그 흔적을 남기지 않게 됩니다. 
B 에서 또다른 A 를 시작한 후, Back 을 누르면 일반적인 경우 이전에 실행되었던 B 가 나타나지만, NO_HISTORY 를 사용하는 경우 
맨 처음에 실행 되었던 A 가 화면에 표시됩니다. 몇 가지 주의할 점이 있습니다. 우선 NO_HISTORY 를 사용하게 되면 Task 에 
해당 Intent 의 정보가 기록되지 않기 때문에, A->B 인 상황 (그림에서 두 번째 단계...) 에서 홈키등을 눌러 다른 Task 로 전환된 후, 
다시 본 Task 로 돌아오게 되면, A Activity 가 화면에 표시됩니다. 또한, B Activity 의 onDestroy() 가 호출되는 시점이 조금 애매합니다.
일반적인 예상과는 달리, B 에서 또다른 A Activity 를 호출하는 세 번째 단계에서는 onStop 까지만 호출되고, 
이 후에 새롭게 호출된 A Activity 가 사라지는 순간 (네 번째 단계) 에서야 onDestroy() 가 호출 됩니다.

 FLAG_ACTIVITY_NO_HISTORY 는 여러가지로 쓸모가 있는데, 특히 특정한 이벤트에 대한 알람등을 위해 
다이얼로그 형태로 화면에 표시되는 Activity 들에 적용하기에 편리합니다. (대게의 경우 팝업은 해당 시점에 한번만 보여주면 되니까.)

 다음으로 굉장히 유용한 플래그 두 가지를 동시에 설명해보고자 합니다.FLAG_ACTIVITY_REORDER_TO_FRONT 와 FLAG_ACTIVITY_CLEAR_TOP플래그입니다. 
우선 간략하게 그림으로 살펴 보겠습니다. A Activity 에서 B Activity 를 
그리고 B 에서 A 를 호출하는 상황을 가정해보았습니다. (A->B->A)


 FLAG_ACTIVITY_REORDER_TO_FRONT 는 매우 특이하게도 Task 의 순서 자체를 뒤바꿔 줍니다. 이 플래그를 사용하면, 
런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우 해당 Activity 를 새롭게 생성하는 대신, 
아래쪽에 위치한 Activity 의 순서를 Task 의 가장 위로 끌어올려줍니다. 따라서 A->B->A 의 순서로 Activity 호출이 일어날때, 
새로운 A 가 생성되는 대신 아래쪽에 위치한 A 가 위로 올라와 최종적으로 B->A 의 형태로 Task 가 구성되게 됩니다. 
어떤 Activity 에서 특정 Activity 로 점프하는 형식의 Flow 를 구성해야하는 경우 요긴하게 사용될 수도 있지만
Task 의 순서를 뒤섞는 다는 점에서 사용에 주의를 기울일 필요가 있습니다.  
(별 생각없이 남발하게 되면 Back 키가를 누를 때 엉뚱한 Activity 가 표시되어 사용자들이 굉장히 혼란스러워 하는 경우가 있습니다.) 

 마지막으로 소개해 드릴 플래그는 바로 FLAG_ACTIVITY_CLEAR_TOP 입니다. 
제가 개인적으로 가장 사랑스럽게 생각하는 녀석입니다.
이 플래그가 사용되는 경우  런치하고자 하는 Activity 가 이미 Task 상에 존재하는 경우,
 해당 Activity 위에 존재하는 다른 Activity 를 모두 종료시켜 줍니다. 
따라서 A->B->A 로 호출이 일어나는 경우, B Activity 가 종료 되고, A Activity 만 Task 에 남게 됩니다.
 (A->B->C->A 인 경우에도 마찬가지로 B와 C 가 종료되고 A 만 남게 됩니다.)

  이 Flag 는 특정 어플리케이션의 대쉬보드 (혹은 홈) Activity 를 호출할 때 굉장히 유용하게 사용될 수 있습니다. 
즉 하나의 어플리케이션이 하나 혹은 두 가지의 주요한 Activity 와 
그 외 특정 값을 선택하는등 단순한 일을 수행하기 위한 여러 개의 Sub-Activity 로 구성되어 있다면, 
주요 Activity 를 호출하는데 이 Flag 를 사용함으로서 어플리케이션의 홈버튼등을 손쉽게 구현할 수 있습니다. 
또 이 Flag 는 FLAG_ACTIVITY_REORDER_TO_FRONT 와는 달린 Task 의 순서를 뒤섞지 않음으로 
사용자에게도 큰 혼란을 주지 않습니다. (사용을 적극 권장합니다.)

 한 가지 주의해야할 점은 A->B->A 형태로 Activity 를 호출 하고자 할 때, 
단순히 FLAG_ACTIVITY_CLEAR_TOP 만을 사용하게 되면, 기존에 생성되었던 A Activity 가 종료된 후 (onDestroy() 가 호출됨) 
새롭게 A 가 생성 (onCreate()) 됩니다. 만일 기존에 사용된 A Activity 가 계속 사용되기를 원한다면, 
SINGLE_TOP 플래그와 함께 사용해야 합니다.

 휴... 생각보다 내용이 길어졌네요. 대부분 SDK 문서를 읽어보면 잘 나와있는 내용이라 새로운 내용은 없습니다만... 
문서 읽기를 게을리한 덕분에 한창을 고생했던 기억이 떠올라 (특히 CLEAR_TOP) 
유용하게 사용한 Flag 를 정리하는 겸 작성해 보았습니다~



 

App 위젯 만들기 (in Eclipse)

Posted by ironmask84
2016. 1. 14. 16:15 나는 프로그래머다!/Java & Android


< 개발 환경 >  
   작성일 : 2016.01.14
   OS 설치 버전 : Windows7 32bit 
   SDK 설치 버전 : 안드로이드 SDK 4.4.2 (KitKat) / API LELVEL : 19 
   Java 설치 버전 : JDK 1.8.0_45 / JRE7 
   이클립스 설치 버전 : Mars
   테스트단말 : LG G2 4.4.2 (KitKat)   

 < 프로젝트 적용 > 
   API LEVEL : 19  
   minSdkVersion : 19 
   targetSdkVersion : 지정 안함 (지정 안하면 min = target)    
   Java Compiler Level : 1.8  
   Text file encoding : 
UTF-8


오랜만에 다시 안드로이드 개발이 시작되었습니다..

Home App을 건드리다가 이제는 위젯을 만들어야 하는데,

간단한 위젯이어서 큰 부담은 없었지만, 처음 만들어 보는 것이여서..

역시 첨 접근이 힘든법이죠. ㅎㅎㅎ


2014년에 사용했던, Eclipse + ADT 버젼을 그대로 사용하려 했는데,

Ant를 이용한 빌드환경 세팅이 잘 안되서...
(정확한 원인은 모르겠으나, 결과적으론 Eclipse 버젼 교체(Juno -> Mars) 후 정상동작)
Eclipse만 Mars 버젼으로 사용하고, and-sdk 세트를 적용(Preferences -> Android ->  SDK Location)

정말 Eclipse가 갈수록 발전하는 것 같네요.

project 생성 시, 기본 세팅을 해주는 것들이 많은데 위젯도 예전부터 있었겠지만,
Activity와 마찬가지로  기본적인 override 함수들 정의 및 기본 layout, strings 까지 생성시켜줍니다.

new-> Others -> Android -> Android Object 로 들어가서 App Widget 선택!


위 메뉴 대로 직접 생성시켜보면,

위젯만드는법을 검색해서 찾아보는 것보다 훨씬 직관적으로 이해하게 되더군요...

역시 여러번 보는 것보다 1번 직접 해보는 것이 효과적입니다. ㅋㅋ

간략히 정리하면, 아래 상자에 있는 것들이 생성됩니다.

1. AndroidManifest.xml -> receiver로 추가


2. res/layout/widget.xml 추가 (위젯 구성 UI Object)


3. res/xml/widget_info.xml 추가 (위젯 사이즈 및 update 주기 설정)


4. Widget Class 생성 

--> extends AppWidgetProvider, onUpdate(), onEnabled(), onDisabled(),

updateAppWidget(Context context, AppWidgetManager appWidgetManager, 

int appWidgetId) 을 기본으로 구성 

    
여기서, onUpdate() 가 인자로 AppWidgetManager appWidgetManager, int[] appWidgetIds 를 

받아오는 이유는, 기본적으로 App위젯은 appWidgetManager 에서 관리되며 이 위젯을 복수로 사용할 경우, 

appWidgetIds[] 를 통해 인덱스가 관리되므로, 각각의 위젯 UI를 Update해주기 위함이다..
onUpdate()는 명시적으로 호출해도 되고, 위에서 설명한 3번 
widget_info.xml에서 

주기 설정이 가능하다.


5. res/value/strings.xml 에 기본 추가되는 TextView에 넣을 string 하나 추가



* Ant : http://blog.naver.com/tommybee/220312166870  참고

* 더욱 자세한 위젯 설명 : http://arabiannight.tistory.com/239 참고


 

html 태그와 속성 실 사용 Tip

Posted by ironmask84
2015. 10. 27. 14:17 나는 프로그래머다!/HTML5


1. div 태그 초간단 레이아웃
http://blog.naver.com/susieredrum?Redirect=Log&logNo=150143093500

2. table 태그 초간단 레이아웃
http://sozoo4u.blog.me/220290918849


 

Async Programming

Posted by ironmask84
2015. 9. 21. 02:52 나는 프로그래머다!/HTML5


아래 참고..

http://programmingsummaries.tistory.com/325

http://inspiredjw.tistory.com/22

** setTimeout() 를 사용할 때 주의사항
--> 아래처럼, function()을 명시적으로 정의해서 패러미터로 넣어야 수행되더라..
     function() 을 명시적으로 넣는 대신, 바로 seTimeout(func1(), 10); 이런식으로 넣으니까 timer가 안걸리는데..
     if ( callback == 'function' ) {        

setTimeout( function () { callback(); }, 10 );
}


 

JavaScript 특징 및 일반 프로그래밍언어와의 차이점

Posted by ironmask84
2015. 9. 16. 14:15 나는 프로그래머다!/HTML5


JAVASCRIPT 

  • 소개
    • HTML의 한계성을 극복하고 동적인 웹 페이지 제작을 가능하게 하는 기능
    • 문제점 및 한계
      • 브라의저의 버전에 따라 호환성에 문제가 있다
      • 익스플로러와 네비게이터에서는 다소 차이가 발생한다.
      • JavaScript의 표준이 없다.
    • 특징
      • JavaScript는 스크립트 언어이다.
      • C,C++,Java와 비슷한 문법을 지니고 있다.
      • JavaScript는 객체기반언어이다.
      • Event 중심으로 동작한다.
      • 플랫폼에 독립적이다.
    • 사용법
      • <Script Language=Javascript>

         <!--

        문장들.........;

        // -->

        </Script>

        <!-- 과 // -->는 자바스크립트를 지원하지 않는 브라우저에서는 주석으로 처리하라는 의미이다

        </Head> 위에나 BODY 내에 기술되면 된다.

  • 연산자
    • 산술열산자
      • + 덧셈  -뺄셈  *곱셈  /나눗셈  %나머지  ++증가연산자  --감소연산자
    • 문자열연산자
      • +문자열 합치기  +=문자열 합치기
    • 논리연산자
      • ! NOT, 논리부정, 논리값의 반대를 취한다.

        && AND, 논리곱, 두 식이 모두 참일 경우에만 참을 리턴

        || OR, 논리합, 두 값중 하나라도 참이면 참을 리턴

    • 대입연산자
      • =   오른쪽의 연산결과를 왼편의 변수에 대입한다.

        += 왼편의 값과 오른편의 값과 합하여 왼편 변수에 대입한다.

        -=  왼편의 값에서 오른편의 값을 빼고 그 결과를 왼편 변수에 대입한다.

        *=  왼편의 값과 오른편의 값을 곱하여 왼편 변수에 대입한다.

        /=   왼편의 값을 오른편의 값으로 나눈다음 그 결과를 왼편 변수에 대입한다.

        %= 왼편의 값을 오른편의 값으로 나눈 다음 그 나머지를 왼편 변수에 대입한다.

    • 비교연산자
      • == 같다  != 다르다  > 크다  >= 크거나 같다  <작다  <=작거나 같다
    • 비트연산자
      • X&Y   X , Y 두 비트 모두가 1이면 1, 그렇지 않으면 0

        X | Y   X 또는 Y의 비트가 1이면 1, 그렇지 않으면 0

        X ^ Y  X , Y의 두 비트가 다르면 1, 그렇지 않으면 0

        ~X      X의 비트가 0이면 1, 그렇지 않으면 0

        X  <<  Y     X 를 Y 비트 만큼 왼쪽으로 Shift (최하위 비트 0적용)

        X  >>  Y     X 를 Y 비트 만큼 오른쪽으로 Shift (최상위 비트는 Shift전의 최상위 비트 값 적용)

        X  <<  Y     X 를 Y 비트 만큼 오른쪽으로 Shift (최상위 비트 0적용)

  • 조건문
    • i f  문
      • if (condition) {statement1;}

        else {statement2;}

    • switch 문

      • switch (expt)

        {

                        case lavel1:

                               statement1;

                               break;

                        ....

                        case  labeln:

                                  statementn;

                                  break;

                        default:

                                 statementk;

                                 break;

        }

  • 반복문
    • for  문
      • for ( 초기값; 조건식; 증가값) {   statement;}
    • while 문
      • whlie (조건식) {   statement;}
    • do  while 문
      • whlie (조건식) {   statement;}
    • laber  문
      • labelName;    statements
      • 프로그램의 특정 블럭에 대하여 식별자를 정의하는 문이다.
    • break 문
      • break;
      • break 문은 반복문이나 label 문을 탈출하도록 하는 문장이다.
      • 만약 label 문으로 탈출하고 싶으면 break label Name; 형식으로 기술하면 된다.
    • continue 문
      • continue;
      • continue 문은 반복문이나 label 문을 다시 시작하도록 하는 문장이다.
      • 만약 label 문을 다시 시작하고 싶으면 continue labelname; 형식으로 기술하면 된다.
  • 함수
    • function 함수이름(인자){     명령문;     [return expression;] }
    • 빌트-인함수
      • 자바스크립트에 이미 포함되어 있는 함수들

        ecal(식) 문자열로 입력된 식을 계산하여 숫자로 리턴

        parselnt(문자열, n) 문자열의 값을 n진수 문자열로 생각하고 이를 10진수의 값으로 바꿔서 리턴

        parseFloat(문자열) 문자열의 값을 부동소수점 숫자로 리턴

        isFinite(변수) 변수가 수인지 판별해서 true/false 리턴

        isNaN(testValue) testValue가 숫자인지 아닌지를 판별해서 trua/false 리턴

        escape (문자열) ASCII 스트링을 URL로 인코딩

        unescape (문자열) escape의 반대

        escape 예제

  • 객체
    • 생성될 객체이름 = new 객체이름(...) ;
  • Global 객체
    • 빌트인 함수들 Global Method라고도 함
  • 내장객체
    • Date 객체
      • 생성자
        • new Data() 현제 시간의 객체

          new Data(atring) "월 일, 년 시:분:초" 시간의 객체

          new Data(y, m, d) y:년, m:월, d:일 날짜의 객체

          new Data(y, m, d, h, m, s) y:년, m:월, d:일, h:시, m:분, s:초 시간의 객체

      • Methods
        • getYear() 년도 4자리를 리턴

          getMonth() 달을 리턴

          getDate() 일을 리턴

          getDay() 요일을 리턴(0.1,2,3,4,5,6)

          getHours() 시간을 리턴(0 에서 23)

          getMinutes() 분을 리턴(0에서 59)

          getSeconds() 초를 리턴(0에서 59)

          getTime() 70-1-1 00:00:00 을 기준으로 현시간의 밀리초 수를 리턴

          getTimezoneOffset() 로컬시간과 GMT 사이의 차이를 리턴

          parse(datestr) dataStr에 대하여 1970-1-1 00:00:00 을 기준으로 현시간의 밀리초

          setYear (년도) 년도 세팅

          setMouth(월) 월을 세팅

          setDate( 일) 일을 세팅

          setHours(시간) 시간을 세팅

          setMinutes(분) 분을 세팅

          setSeconds(초) 초를 세팅

          setTimes(시간) 시간을 세팅

          toGMTString() Date 객체의 날짜들 GMT 스트링으로 리턴

          toLocaleString() Date 객체의 날짜를 로컬 표현의 스트링으로 리턴

          UTC(y,m,d,h,m,s) 인자를 입력받아 밀리 초의 값 리턴

    • document
      • 속성
        • alinkColor     Alink 속성을 표시하는 스트링

          anchors    문자내의 애커들에 대한 배열

          applets    문서내의 애플릿들에 대한 배열

          bgColor   배경색깔의 속성값을 반영하여 자바스크립트 코드에서 수정 가능

          cookie  쿠키에 대한 레퍼런스

          domain   이 문서를 보내온 서버의 도메인 이름 스트링

          embeds   문서내의 내장 객체들에 대한 배열

          fgColor   문서내의 글자색깔 속성을 반영하는 스트링, 자바스크립트 코드에서 수정 가능

          forms   문서내에 존재하는 폼들에 대한 배열

          images   문서내에 존재하는 이미지들에 대한 배열

          lastModified    문서가 수정된 최근 날짜를 표시하는 스트링

          layers  문서내에 존재하는 레이어에 대한 배열

          linkColor  링크 속성을 표시라는 스트링

          links   문서내에 존재하는 링크들에 대한 배열

          plugins   브라우저 내에 설치된 플러그인들에 대한 배열

          referer   이 문서를 로드한 문서의 URL을 표시하는 스트링

          title   문서의 제목인 TITLE 속성을 반영하는 스트링

          URL   이 문서의 URL을 반영하는 스트링

          vlinkColor   vlink 속성을 반영하는 스트링

      • 매소드
        • captureEvents(이벤트타입들)    파라미터로 주어진 이벤트를 캡쳐할 것을 지시한다.

          close()    문서에 출력되는 스티림을 닫고 미출력된 문서의 나머지 부분을 화면에 출력

          getSelection()  현재 윈도우에서 마우스나 키보들로 선택된 문자열을 리턴

          handleEvent()   파리미터로 지정된 이벤트의 이벤트 핸들러를 호출

          open()   비어있는 새문서를 연다.

          releaseEvent()   지정된 타입의 이벤트를 더 이상 캡쳐하지 않도록 지정

          writeln()   write() 후에 "\n"을 추가하여 출력

    • window
      • 속성
        • defaultStatus     디폴트 상태바 메시지

          document     현재 나타나는 문서

          frame    윈도우 내의 프레임

          frame array   문서에 나타나는 윈도우 프레임 객체를 순서대로 나열한 배열

          history   윈도우 히스토리 리스트

          length  윈도우에서 프레임의 개수를 나타낸다.

          location   윈도우에서 나타나는 문서의 완전한 URL

          name   윈도우가 열릴 때 주어지는 이름

          opener    window,open이 현재 윈도우를 열도록 사용하는 스크립트의 윈도우를 참조한다.

          parent   현재 프레임을 포함하는 윈도우 프레임과 윈도우 객체의 프로퍼티이다.

          self   현재 윈도우나 현재 프레임

          status    상태바의 메시지

          top   현재의 프레임을 가지고 있는 최고 윈도우

          window   현재 윈도우나 현재 프레임

          toolbar    윈도우 틀바 객체에 대한 레퍼런스

          statusbar   윈도우 상태바 객체에 대한 레퍼런스

      • 매소드
        • alert()   경고 메시지를 가진 상자를 출력한다.

          back()   톱레벨 윈도우에서 최근 히스트로리로 돌아간다.

          blur()   윈도우의 포커스를 해제한다.

          captureEvent()   이벤트를 캡쳐할 것을 지시한다.

          clear In terval()   setInterval에 의해 설정된 타이머를 해제한다.

          clear Timeout()   setTimeout에 의해 설정된 타이머를 해제한다.

          close()   윈도우를 종료한다.

          con firm() 확인 메시지를 담은 상자를 출력한다.

          find()   윈도우의 본문에서 지정된 텍스트 스트링을 찾는다.

          forward()   히스트리 리스트에서 다음 URL을 로드한다.

          handleEvent()   파라미터에 지정된 이벤트의 이벤트 핸들러를 직접 호출한다.

          home()   브라우저에 설정된 홈 페이지를 로드한다.

          moveBy(폭,높이)    윈도우를 현재 위치에서 상대적인 량 만큼 이동한다.

          moveTo(x좌표,y좌표)   윈도우를 임의의 절대 위치로 이동한다.

          open()   새로운 웹 브라우저를 연다

          print()   윈도우의 내용을 프린트 한다.

          prompt()   프롬프트를 출력하고 입력창을 출력한다.

          releaseEvents()   캡쳐하기로 된 이벤트의 캡쳐를 해제한다.

          releaseBy(폭,높이)   윈도우를 현재 크기에서 상대적인 량만큼 크기를 변경한다.

          releaseTo(x좌표,y좌표)    윈도우를 임의의 크기로 변경한다.

          routeevent()   이벤트가 정상적인 경로로 전달되도록 한다.

          scrollBy(폭,높이)    지정된 량만큼 윈도우를 스크롤한다.

          scrollTo(x좌표,y좌표)   윈도우를 절대적인 위치로 스크롤한다.

          set Interval()   지정된 주기를 반복적으로 타이머 이벤트가 발생하도록 타이머를 설정한다.

          set Timeout()   지정된 시간이 지나면 1회적으로 타이머 이벤트가 발생하도록 타이머를 설정한다.

          stop()   윈도우에 문서의 로드를 중단한다.

  • 데이터형
    • Number : 정수, 실수 등
    • 논리값 : True or False
    • String : 문자열
    • Null : 아무런 값도 존재하지 않는 경우
    • Undefined : 변수는 선언되었지만 어떤 값으로 초기화 되지 않는 경우
  • 변수
    • 변수를 선언하는 방법
      • 변수이름 = 초기값;
      • var 변수이름;
      • var 변수이름 = 초기값;
    • 변수선언시 주의 사항
      • 첫번째 문자는 반드시 영문자 또는 "_"
      • 공백문자가 포함되어서는 안된다
      • 이미 자바 스크립트에서 사용되는 예약어는 변수로 사용할 수 없다
      • 자바스크립트는 대소문자를 깐깐하게 구별한다
    • 전역변수
      • 선택적으로 var를 사용해서 변수 선언
      • 전역변수를 특정 함수 내에서 사용하기 위해서는  this 라는 키워드를 사용하면 된다.
      • C에서는 ::를 앞에 붙여서 표현
    • 지역변수
      • 반드시 var 를 사용해서 변수 선언
  • + - 상수
    • 특수문자
      • \\    Backslash

        \'    Single Quotation Mark

        \"    Double Quotation Mark

        \t    Tab

        \n   New Line

        \f    Form Feed

        \b   Backspace

        \r    Carriage Return

        C와 유사하다.

  • 기타
    • HTML 관련
      • html 문서 열 때 생성되는 객체

        window    최상위 객체로, 윈도우 마다 하나씩 존재하는 객체이다.

        document   HTML 문서마다 하나씩 존재하며, HTML 내용에 관한 정보를 가진다.

        상당히 자주 사용된다.

        history   현재 window에서 방문기록을 가지고 있는 객체이다.

        go, back    등의 메소드와 함께 사용된다.

        location   현재 HTML 페이지의 UTL에 관한 정보를 가지는 객체이다.

        navigator   현재 사용중인 브라우저의 이름과 버전등에 관한 정보를 지닌 객체이다.

        form    폼에 대한 정보를 가지고 있는 객체이다. form에 name을 붙여서 구별할 수 있다.

        하나의 document에 여러개의 form 객체를 생성할 수 있다.

        frme   frame 태그에 의해 생성된 객체이다.

        link   <A HREF="">로 표현된 객체. 링크마다 하나의 객체가 생성된다.

        image   이미지를 표현하는 객체

        layer   DHTML에서 지원하는 객체

        anchor   HTML 문서내의 앵커를 표현하는 객체 <A name="">

        area   HTML 문서내의 이미지 맵의 한 영역을 표현하는 객체

    • 이벤트
      • abort    onAbort    사용자가 이미지 로딩을 강제로 중단할 때

        blur     onBlur    윈도우,  폼 구성요소, 프레임이 포커스를 잃을 때

        change    onChange   Select, Text, Textarea 객체의 필드 값을 변경한 후 포커스를 잃을 때

        click    onClick    폼 구성 요소가 클릭될 때

        dblclick    onDblclick   폼 구성 요소나 링크를 더블 클릭할 때

        dragdrop    onDragDrop   사용자가 한 객체를 브라우저 윈도우 상으로 드롭할 때

        error    onError    문서나 이미지의 로딩시 오류가 발생할 때

        focus   onFocus    윈도우, 프레임, 프레임셋, 폼 요소가 포커스를 받을 때

        keydown   onkeyDown     사용자가 키를 누르는 순간

        keypress   onkeypress    사용자가 키를 누른 채 유지하는 동안

        keyup    inkeyUp  사용자가 누른 키를 놓는 순간

        load   onLoad   브라우저에 HTML 문서 로딩 직후 혹은 프레임셋 문서의 모든 프레임의 로딩이 마칠 때

        mousedown    onMouseDown    사용자가 마우스를 누르는 순간

        mousemove    onMouseMove    사용자가 마우스를 움직일 때 마다

        mouseover    onMouseOver   사용자가 마우스 커서를 이미지맵이나 링크 위에 올려 놓을 때

        mouseup    onMouseUp    사용자가 마우스 커서를 이미지맵이나 링크 위에서 내려 놓을 때

        move    onMove    사용자가 자바스크립트 코드에 의해 윈도우나 프레임의 위치가 이동될 때

        reset   onReset  사용자가 reset 버튼을 누를 때

        resize    onResize   사용자나 자바스크립트 코드에 의해 윈도우나 프레임의 크기가 조절되는 순간

        select    onSelect   사용자가 Text나 Textarea  객체의 필드 내의 텍스트 일부를 선택할 때

        submit  onSubmit    사용자가 submit 버튼을 누를 때

        unload    onUnload    사용자가 현재 HTML 문서 보기를 종단하고 다른 웹 사이트로 이동할 때


출처 : http://cafe.naver.com/dotnettree/4


 

Atom - Text tool for Progamming

Posted by ironmask84
2015. 9. 9. 16:04 나는 프로그래머다!/HTML5


JavaScript를 하면서, 가독성이 너무 떨어지는 것을 느낀 후...

회사동료를 통해 알게 된 Tool 인 Atom..

Source Insight 보다 훨씬 가볍고, 소스 구조 및 빠른 검색이 장점이다.
물론 기능은 좀 더 Light 한 것이 당연..

아래 링크를 이용해주시면 됩니다..

https://atom.io/

 

Mozilla Developer Network

Posted by ironmask84
2015. 9. 2. 08:40 나는 프로그래머다!/HTML5


 

C 와 Java 에선 못보던 JavaScript만의 특이한 문법

Posted by ironmask84
2015. 7. 30. 14:31 나는 프로그래머다!/HTML5


1. == 과 ===
== 는 1 == '1' 을 true로 출력한다. 즉, 데이터 타입이 달라도 의미상 값이 같으면 true로 처리한다.
이는 SW개발 상 바람직하지 못하므로, ===를 쓰는 것을 추천한다.
!= 과 !== 의 용도도 동일한 맥락이라고 생각하면 된다.

2. null 과 undefined 과 NaN
null은 값이 없는 상태를 명시적으로 정의한 것.
undefined는 실제로 값이 정의가 안된 것.(C에서는 전역변수면 default값이 들어가고, 지역변수는 쓰레기값 임)
NaN은 0/0 과 같은 연산의 결과로 만들어진 것 (C에서는 쓰레기 값이 들어가지..)
( null === undefined // false    null == undefined // true    NaN === NaN // false)

3. true 과 false
== 연산자는 숫자 1만을 true로 숫자 0만을 false로 간주한다. (물론, ===에서는 다른것으로 체크)
(C에서는 0을 false로 인식, 나머지 숫자들은 true이다..)

4. 


 

JavaScript - 이벤트 응용4 - jQuery 활용

Posted by ironmask84
2015. 7. 30. 09:15 나는 프로그래머다!/HTML5


앞서 포스팅했던 이벤트 등록법은 순수 html 혹은 JavaScript를 이용한 방법이었습니다.

jQuery를 이용하면 아래와 같이 매우 간결하고 쉽게 이벤트 등록이 가능하므로,
매우 생산적! 이라고 할 수 있습니다. (프로그래머들은 간결한 것을 좋아하죠 :) )

opentutorials.org 사이트에서 참 많이 배우고 가는데요.
밑에 예시도 거기서 참조하였습니다. ㅎ

<input type="button" id="pure" value="pure" />
<input type="button" id="jquery" value="jQuery" />
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
// 순수하게 구현했을 때
var target = document.getElementById('pure');
if(target.addEventListener){
target.addEventListener('click', function(event){
alert('pure');
});
} else {    // for I.E8 이하
target.attachEvent('onclick', function(event){
alert('pure');
});
}
// jQuery를 사용했을 때
$('#jquery').on('click', function(event){
alert('jQuery');
})
</script>


** selector를 이용한 이벤트 등록

<ul>
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">JavaScript</a></li>
</ul>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$('ul').on('click','a, li', function(event){
console.log(this.tagName);
})
</script>


** html 태그가 로딩되기 전에 script를 실행시키는 late binding
(onload 이벤트와는 다르다.)

<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$('body').on('click','a, li', function(event){
console.log(this.tagName);
})
</script>
<ul>
<li><a href="#">HTML</a></li>
<li><a href="#">CSS</a></li>
<li><a href="#">JavaScript</a></li>
</ul>


** 다중 바인딩

1) 하나의 엘리먼트에 여러개 이벤트 등록

<input type="text" id="target" />
<p id="status"></p>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$('#target').on('focus blur', function(e){
$('#status').html(e.type);
})
</script>

2) 이벤트에 따라 다른 핸들러 등록

<input type="text" id="target" />
<p id="status"></p>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
$('#target').on({
'focus' : function(e){
},
'blur' : function(e){
}
})
</script>

3) chaining 기법도 가능
$('#target').on('focus', handler).on('blur', handler);


** 이벤트 제거 (off 함수 사용)

<input type="text" id="target"></textarea>
<input id="remove" type="button" value="remove" />
<p id="status"></p>
<script src="//code.jquery.com/jquery-1.11.0.min.js"></script>
<script>
var handler = function(e){
$('#status').text(e.type+Math.random());
};
$('#target').on('focus blur', handler)
$('#remove').on('click' , function(e){
$('#target').off('focus blur', handler);
console.log(32);
})
</script>

출처
https://opentutorials.org/module/904/6862
https://opentutorials.org/module/904/6888

 

JavaScript - 이벤트 응용2 - 이벤트 타입

Posted by ironmask84
2015. 7. 29. 16:39 나는 프로그래머다!/HTML5


1. 폼
submit : 폼의 정보를 서버로 전송하는 명령인 submit시에 일어난다. form 태그에 적용된다.
change : 폼 컨트롤의 값이 변경 되었을 때 발생, input(text,radio 등), textarea, select 태그에 적용
blur : 엘리먼트에 포커스가 생겼을 때
focus : 포커스가 사라졌을 때 발생

2. 문서 로딩
웹페이지를 프로그래밍적으로 제어하기 위해서는 웹페이지의 모든 요소에 대한 처리가 끝나야 한다. 이것을 알려주는 이벤트가 load, DOMContentLoaded이다.

그런데 load 이벤트는 문서내의 모든 리소스(이미지, 스크립트)의 다운로드가 끝난 후에 실행된다. 이것을 에플리케이션의 구동이 너무 지연되는 부작용을 초래할 수 있다.

DOMContentLoaded는 문서에서 스크립트 작업을 할 수 있을 때 실행되기 때문에 이미지 다운로드를 기다릴 필요가 없다.

<script>

window.addEventListener('load', function(){
console.log('load');
})
window.addEventListener('DOMContentLoaded', function(){
console.log('DOMContentLoaded');
})
</script>

3. 마우스
아래 링크 참조
http://output.jsbin.com/pepib/4/

  • click
    클릭했을 때 발생하는 이벤트. 
  • dblclick
    더블클릭을 했을 때 발생하는 이벤트
  • mousedown
    마우스를 누를 때 발생
  • mouseup
    마우스버튼을 땔 때 발생
  • mousemove
    마우스를 움직일 때
  • mouseover
    마우스가 엘리먼트에 진입할 때 발생
  • mouseout
    마우스가 엘리먼트에서 빠져나갈 때 발생
  • contextmenu
    컨텍스트 메뉴가 실행될 때 발생


참고 출처
https://opentutorials.org/module/904/6762
https://opentutorials.org/module/904/6765
https://opentutorials.org/module/904/6766

 

JavaScript - 이벤트 응용3 - 기본 이벤트 동작 취소 방법

Posted by ironmask84
2015. 7. 29. 16:18 나는 프로그래머다!/HTML5


 

JavaScript - 이벤트 응용1 (버블링과 캡쳐링)

Posted by ironmask84
2015. 7. 28. 15:23 나는 프로그래머다!/HTML5


버블링과 캡쳐링은 addEventListener() 사용 시, 3번째 인자에 따라 구분된다.
true이면 캡쳐링이며, false 혹은 인자를 비워두면 버블링이다.

버블링 : 중첩된 태그에 등록된 이벤트를 가장 안쪽 태그부터 수행
캡쳐링 : 중첩된 태그에 등록된 이벤트를 가장 바깥쪽 태그부터 수행

웹브라우져 호환때문에도 그렇고, 거의 버블링을 사용한다.


http://output.jsbin.com/yozax/1/  <-- 웹 상에서 코드수정이 가능한 site 굿!


<html>
<head>
<style>
html{border:5px solid red;padding:30px;}
body{border:5px solid green;padding:30px;}
fieldset{border:5px solid blue;padding:30px;}
input{border:5px solid black;padding:30px;}
</style>
</head>
<body>
<fieldset>
<legend>event propagation</legend>
<input type="button" id="target" value="target">
</fieldset>
<script>
function handler(event){
var phases = ['capturing', 'target', 'bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
}
document.getElementById('target').addEventListener('click', handler, true);
document.querySelector('fieldset').addEventListener('click', handler, true);
document.querySelector('body').addEventListener('click', handler, true);
document.querySelector('html').addEventListener('click', handler, true);
</script>
</body>
</html>


위 코드에서 이벤트 실행 전파를 막는 방법도 있다.
아래의 핸들러를 정의한 후에 이벤트 등록 시에 사용하면 가능한다.
아래 코드를 추가 및 수정하면, body 태그의 이벤트 까지만 호출된다.

function stophandler(event){
var phases = ['capturing', 'target', 'bubbling']
console.log(event.target.nodeName, this.nodeName, phases[event.eventPhase-1]);
event.stopPropagation();
}
document.querySelector('body').addEventListener('click', stophandler, false);


참고출처 : https://opentutorials.org/module/904/6768

 

JavaScript - 이벤트

Posted by ironmask84
2015. 7. 28. 11:21 나는 프로그래머다!/HTML5


<!DOCTYPE html>
<html>
<body>
<input type="button" onclick="alert(window.location)" value="alert(window.href)" />
<input type="button" onclick="window.open('bom.html')" value="window.open('bom.html')" />
</body>
</html>


event target
->target은 이벤트가 일어날 객체를 의미한다.

event type
->이벤트의 종류를 의미한다.
   (
https://developer.mozilla.org/en-US/docs/Web/Reference/Events)

event handler
-> 이벤트가 발생했을 때 동작하는 코드를 의미한다. 
    위의 예제에서는 alert(window.location)이 여기에 해당한다.

출처 : https://opentutorials.org/module/904/6629


** 이벤트 등록방법

1. inline : 이벤트를 이벤트 대상의 태그 속성으로 지정하는 것이다.
<input type="button" onclick="alert('Hello world');" value="button" /> <input type="button" onclick="alert('Hello world, '+this.value);" value="button" />

2. property listener : 
이벤트 대상에 해당하는 객체의 프로퍼티로 이벤트를 등록하는 방식
event 객체에는 여러가지 정보가 담겨있다!!(console.dir(event); 확인)

<body>
<input type="button" id="target" value="button" />
<script>
var t = document.getElementById('target');
t.onclick = function(event){
alert('Hello world, '+event.target.value)
}
</script>

// I.E 8이하 버젼 호환을 위해서는 아래와 같이 추가 예외처리 필요

<input type="button" id="target" value="button" />
<script>
var t = document.getElementById('target');
t.onclick = function(event){
var event = event || window.event;
var target = event.target || event.srcElement;
alert('Hello world, '+target.value)
}
</script>


3. addEventListener() :
가장 권장하는 방식. 한 target에 여러 이벤트 등록 혹은 정의해 놓은 한 이벤트 핸들러를 여러 객체에 등록할 수 있다.


var t = document.getElementById('target');
if(t.addEventListener){
t.addEventListener('click', function(event){
alert('Hello world, '+event.target.value);
});
} else if(t.attachEvent){    // I.E 8이하 버젼의 호환을 위해..
t.attachEvent('onclick', function(event){
alert('Hello world, '+event.target.value);
})
}
// 한 target에 여러 이벤트를 등록
<input type="button" id="target" value="button" />
<script>
var t = document.getElementById('target');
t.addEventListener('click', function(event){
alert(1);
});
t.addEventListener('click', function(event){
alert(2);
});
</script
// 하나의 리스너로 여러 target에 적용
<input type="button" id="target1" value="button1" />
<input type="button" id="target2" value="button2" />
<script>
var t1 = document.getElementById('target1');
var t2 = document.getElementById('target2');
function btn_listener(event){
switch(event.target.id){
case 'target1':
alert(1);
break;
case 'target2':
alert(2);
break;
}
}
t1.addEventListener('click', btn_listener);
t2.addEventListener('click', btn_listener);
</script>

출처
https://opentutorials.org/module/904/6759
https://opentutorials.org/module/904/6760
https://opentutorials.org/module/904/6761

 

JavaScript에서의 객체와 객체지향

Posted by ironmask84
2015. 7. 22. 15:47 나는 프로그래머다!/HTML5


기본적으로 배열이 0,1,2 ... 와 같이 숫자를 인덱스로 해서 값을 담아내는 그릇이라고 하면,
JavaScript에서의 객체는 이 인덱스가 숫자도 가능하지만, 문자로도 가능한 점이 특징이다.

따라서, 타 프로그래밍 언어에서는 연관배열(associative array) 또는 맵( map), 딕셔너리(Dictionary)라는 데이터 타입이 객체에 해당한다.

ex)

var val1 = {};    // {}; 의 표현이 객체 생성이다.  []; 표현은 배열!

val1.val1 = 'ironmask';
val1.ironmask = 100;
val1['iromask2'] = 90;
==> Object {val1: "ironmask", ironmask: 100, ironmask2: 90}

==> val1['val1'] 은 "ironmask" 를 리턴
      val1['va'+'l1'] 과 같은 표현도 가능
      val.val1 과 같이도 사용 가능
===> 따라서, 'val1' 을 key라고 하고, 값을 value 로 부르는 경우가 많다.

한번에 값들을 정의하는 경우
// 이렇게 객체 내에 속성과 메소드를 그룹화해서 사용가능하므로, 이것이 JavaScript의 객체지향
var val1 = {
       'list' : {'ironmask' : 100, 'LG' : 90, 'Samsung' : 80}
      
'show' : function() {
                  alert("hello world");

        }

}

val1['show']();  // 함수는 이렇게 사용

* Tip 

for(var key in val1) {    // for in 문이라고 한다. (배열에서도 동일하게 사용 가능)
console.log(val1[key]);   // key를 순회하면서, key에 대응하는 값들을 찍어준다.
}