절대 레이아웃, 테이블 레이아웃은 자주 사용될 것 같지 않아 생략.
(7)스크롤 뷰
스크롤 뷰는 그 안에 추가된 뷰의 영역이 한 번에 다 보이지 않을 때 사용된다.
안드로이드에서는 다른 언어처럼 스크롤바를 일일이 뷰의 보이는 영역과 연결하는 과정 없이 단순히 스크롤뷰 안에 뷰를 넣는 것으로 구현 가능하다.
ScrollView 태그를 사용하며 그 안에 한 개의 뷰가 들어갈 수 있다.
<LinearLayout
   <HorizontalScrollView   //수평 스크롤을 위한 스크롤 뷰
      <ScrollView                //수직 스크롤을 위한 스클롤 뷰
         <ImageView            //이미지를 보여주는 이미지뷰
         />
      </ScrollView>
   </HorizontalScrollView>
</LinearLayout>

(8)프레임 레이아웃과 뷰의 전환
프레임 레이아웃의 중첩(Overlay)기능이 자주 사용될 수 있다.
뷰를 하나하나 추가할 경우 추가된 순서대로 차곡차곡 쌓인다. (가장 마지막 뷰가 가장 먼저 보인다)
뷰의 가시성(visibility) 속성을 보이지 안도록 하면 그 다음 뷰가 보인다.
addView(), removeView() 와 같은 메소드를 이용해 뷰를 추가/삭제 전환할 수 있다.

(9)기본 위젯들
텍스트뷰
text
textColor: 색상설정은 #AARRGGBB, Alpha값은 투명도 표현 FF(불투명), 00(투명), 88(반투명)
textSize: 사이즈 표현단위는 dp, sp, px
textStyle: normal, bold, italic, bold|italic
textFace: 폰트설정, 몇개안됨 (normal, sans, serif, monospace)
singleLine: 문자열이 한 줄로만 표시되도록 설정

버튼
기본버튼, 라디오 버튼, 라디오 버튼을 묶은 라디오 그룹, 체크박스

에디트텍스트
사용하기 쉽긴하지만 사용자가 글자를 입력하기 위해 포커스를 둘 때마다 소프트 키패드가 화면상에 나타나기도 한다. 한/영/숫자 등 입력하는 문자유형도 다양하므로 신경써서 구현할 필요 있다.
에디트텍스트는 입력하는 문자의 유형을 지정할 수 있는 속성을 제공한다. 숫자만 입력되도록 하는 등
<EditText
   android:textSize="18sp"
   android:autoText="true"   //철자 자동 고침
   android:capitalize="words"   //가장 앞 글자를 대문자로 자동 변경
   android:hint="put in your name."   //기본 안내문 표시
   >
</EditText>

이미지뷰
이미지뷰는 이미지를 화면에 표시하기 위해 제공되는 가장 간단한 위젯 중 하나.
이미지를 로딩하여 설정하기 위해 [/res/drawable-hdpi] 폴더 밑에 있는 이미지파일을 복사하여 넣은 후 리소스에서 가져오는 방법 사용가능
drawable 폴더 이용 팁
[/res/drawable] 폴더안에 이미지를 넣게 되면 일반적으로 사용되는 이미지로 인식되지만
[/res/drawable-hdpi] 고화질/ [/res/drawable-mdpi] 중화질/ [/res/drawable-ldpi] 저화질
각각의 폴더에 맞는 이미지를 넣어 두면 화면의 해상도에 따라 이미지가 자동적용된다.
해상도에 관계없이 이미지를 한 곳에만 넣고 싶다면 이중 하나의 폴더에만 지정해서 넣어도 된다.
[/res/drawable] 폴더를 새로 만들어 넣는것도 가능

ImageView imageView1;
imageView1 = (ImageView)findViewById(R.id.imageView1);

Resource res = getResources();
BitmapDrawable bitmap = (BitmapDrawable)res.getDrawable(R.drawable.imagefile);
int bitmapWidth = bitmap.getIntrinsicWidth();
int bitmapHeight = bitmap.getInstrinscHeight();

imageView1.setImageDrawable(bitamp);
imageView1.getLayoutParams().width = bitmapWidth;
imageView1.getLayoutParams().height = bitmapHeight;
by wisegirl 2013. 3. 2. 00:02

(1)뷰와 뷰그룹

뷰(View)는 일반적으로 콘트롤이나 위젯이라는 이름으로 불리는 UI구성요소

뷰그룹(ViewGroup)은 뷰들을 여러 개 포함하고 있는 것

뷰그룹을 뷰에서 상속하면 뷰그룹도 뷰가 된다.

즉, 뷰그룹 역시 다시 하나의 뷰 라고 본다면 또 다른 뷰 그룹이 이 뷰그룹을 뷰처럼 다룰 수 있다.

: 컴포지트 패턴(Composite Pattern), 확장성이 뛰어남

[Object] <- [View] <- [ViewGroup] <- [LinearLayout] (뷰를 배치하는 레이아웃도 뷰를 상속)

                            <- [TextView] <- [Button]

 

- layout_width, layout_height : 뷰의 폭과 높이를 설정

속성값은 match_parent(무조건 남은 여유공간 채움), wrap_content(뷰에 들어있는 내용물 크기만큼 뷰사이즈 설정)

android:layout_width="wrap_content"

android:layout_height="wrap_content"

뷰의 크기지정 단위

px(픽셀) : 화면 픽셀

dp, dip(밀도 독립적 픽셀) : density independent pixel

sp, sip(축척 독립적 픽셀) : scale independent pixel

in(인치)

mm(밀리미터)

em(텍스트크기)

- id : 뷰의 id를 지정

android:id="@+id/button"

- background : 뷰의 배경을 설정

지정하지 않으면 디폴트 회색으로 지정

색상지정 포맷 ARGB (A: Alpha, R: Red, G:Green, B: Blue)

#RRGGBB

#AARRGGBB

 

(2)레이아웃

레이아웃 /res/layout/mail.xml 파일이 디폴트로 생성된다.

기본 레이아웃

- 리니어 레이아웃 : 박스 모델

- 상대 레이아웃 : 룰 기반 모델 ex) top, bottom

- 절대 레이아웃 : 절대 위치 모델(좌표값)-미지원

- 테이블 레이아웃 : 격차 모델 ex) columns, rows

- 스크롤 뷰

 

뷰 배치속성

- 채우기(fill model) : 부모의 여유공간을 채우는 방식

- 방향(orientation)

- 정렬방향(gravity)

- 여유공간(padding)

- 공간가중치(weight)

 

(3)리니어 레이아웃 (LinearLayout)

ㅇ  앱이 실행될 때 처음 보이는 액티비티를 매니페스트에서 바꾸어줄 수 있다. (AndroidManifest.xml)

<activity android:name="sampleActivity">

 

ㅇ 안드로이드에서 컨텍스트 (context) 객체의 역할은?

일반적으로 문맥 이라는 의미로 쓰이지만, 안드로이드 에서는 객체의 상태 정보로 표현됨.

UI구성요소인 뷰에 대한 정보를 손쉽게 확인하거나 설정 할 수 있도록 뷰의 생성자에 Context객체를 전달

 

ㅇ layout_gravity 와 gravity 의 차이점

layout_gravity는 부모 컨테이너의 여유공간 내에서 뷰가 모두 채워지지 않은 공간내에서 뷰의 정렬

: 화면에서 버튼의 정렬 위치

gravity는 뷰 내에서 표시되는 내용물의 정렬, 단. wrap_content상태에서는 의미없음

: 버튼에 표시되는 텍스트의 정렬 위치

: 속성값들

top, bottom, left, right,

center_vertical, center_horizontal (수직, 수평방향의 중앙에 배치)

fill_vertical, fill_horizontal (수직,수평방향으로 여유 공간만큼 확대하여 채우기)

center (수직방향과 수평방향의 중앙에 배치하기)

fill (수직방향과 수평방향으로 여유 공간만큼 확대하여 채우기)

clip_vertical, clip_horizontal (대상 객체의 상하, 좌우 길이가 여유 공간보다 클 경우 남는 부분 잘라내기)

 

ㅇ 여유공간 설정 (padding/margin)

보통 버튼이나 텍스트뷰와 같이 화면을 구성하는 콘트롤을 뷰 중에서도 '위젯' 이라고 부르는데 위젯이나 뷰 들은 부모 컨테이너로 부터 할당된 공간을 차지하게 되며 이를 위젯 셀(cell) 이라고 부른다.

- 뷰 내에서 글자나 이미 같은 내용물이 차지하는 사이즈와의 여백 공간을 paddingLeft/Right/Top/Bottom

 : 뷰 내부의 여백

- 위젯 셀 내부에서 뷰가 차지하는 공간과의 여백 공간을 layout_marginLeft, layout_margieTop

 : 부모 여유공간과 뷰 사이의 여백

 

ㅇ 공간가중치 (layout_weight)

뷰의 중요도를 의미하는 것으로 그 값의 비율만큼 뷰에게 여유공간을 할당

1:1, 1:2, 1:3 과 같이 비율로 지정

 

(4)상대 레이아웃 (RelativeLayout)

부모 컨테이너나 다른 뷰와의 상대적인 위치를 이용해 뷰의 위치 결정

예를들어 버튼A 가 있다면 추가되는 버튼B는 버튼A의 오른쪽 아래, 버튼C는 버튼A의 아래 같은식

 

ㅇ 상대 레이아웃에서 부모 컨테이너와의 상대적 위치를 이용하는 속성

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   지정한 뷰와 내용물의 아래쪽 기준선을 맞춤

by wisegirl 2013. 3. 1. 00:38

간단한 애니메이션 만들기

ㅇ 전형적인 애니메이션 사용방식은 애니메이션 액션 정보를 XML로 정의한 후 사용

ㅇ Animation 객체로 만든 후 뷰의 startAnimation() 메소드를 사용하면 간단하게 애니메이션 동작

   : 리소스 쪽에 애니메이션 액션정보 미리 구현

   : /res/anim/flow.xml -> AnimationUtils.loadAnimation() -> Animation객체 -> startAnimation() -> View객체

flow.xml 예제

<set>

   <translate

      android:fromYDelta="0%p" //출발점

      android:toYDelty="100%p" //도착점

      android:duration="3000"    //이동시간 3초

   </trandslate>

</set>

 

애니메이션 2개 이상을 이어 붙이고 싶은 경우, onAnimationEnd()메소드로 처음 애니메이션이 끝나는 시점 인지

다시말해, onAnimationEnd() 메소드 내에서 두번째 애니메이션에 대한 startAnimation() 호출

by wisegirl 2013. 2. 28. 23:03

WebView를 이용하여 웹 브라우저 사용하기

<WebView

...

/>

인터넷 권한 추가

<uses-permission android:name="android.permission.INTERNET"/>

 

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

WebSettings settings = webview.getSetting(); //셋팅정보 가져오기

settings.setJavaScriptEnable(true);

webview.loadUrl("http://m.naver.com"); //웹페이지 뿐만 아니라 로컬의 html 파일로딩도 가능하다. 자바스크립트

 

상단은 애플리케이션 영역, 하단은 웹뷰 영역

 

by wisegirl 2013. 2. 28. 22:42

ㅇ 탭 위젯은 여러 개의 뷰를 조합하여 만든 복합 위젯

ㅇ 프레임 레이아웃을 중첩하는 등의 방법으로 직접 구성하는 방식과 유사한 구성

 

MyTab 탭 스타일로 직접 레이아웃을 구성하여 만들기

frameLayout 한번에 하나의 위젯만 보여진다. 나머지는 뒤에 중첩되어 숨겨진다.

orientation, gravity 속성은 의미없다.

위젯을 레이아웃으로 잡아주면 상단 탭 메뉴바의 터치에 따라 마치 화면이 바뀌는것 처럼 보인다.

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

버튼1 | 버튼2 | 버튼3    : 탭호스트(탭위젯)

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

탭 1-> 탭2-> 탭3          : 프레임레이아웃

차례대로 display 

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

이런 것들을 미리 정의/구현 해 둔 것이 TabHost (extends TabActivity)

 

인텐트를 통해서 액티비티 형태로 화면 받는다.

결국 탭호스트에서 클릭되는 버튼에 따라 전환되는 것이 액티비티 단위로 움직인다.

 

 

Button startButton1 = (Button)findviewbyid(R.id.startbutton1);

startbutton1.setonclicklistener(new OnClickListener(){

public void onClick(Veiw v){

}

}

by wisegirl 2013. 2. 28. 22:22

객체에 OnClickListener를 설정할 수 있는 메소드를 제공하므로 별도 클래스 정의 없이 리스터 객체 정의/설정가능

:위임모델(Delegation Model) - 자바에서도 일반적으로 사용되는 이벤트 처리 방식, 컴포넌트 마다 하나의 이벤트 처리루틴 할당 방식

 

ㅇ 터치 이벤트 : 화면을 손가락으로 누를 때 방생하는 이벤트

ㅇ 키 이벤트 : 키패드나 하드웨어 버튼을 누를 때 발생하는 이벤트

ㅇ 제스쳐 이벤트 : 터치 이벤트 중에서 일정 패턴을 만들어 내는 이벤트

 - ex) onDown(), onShowPress(), onSingleTapUp(), onSingleTapConfirmed(), onDoubleTap() etc.

ㅇ 포커스 : 뷰 마다 순서대로 주어지는 포커스

ㅇ 화명 방향 변경 : 화면의 방향이 가로/세로로ㅗ 바뀜에 따라 발생하는 이벤트

 

제스쳐 이벤트 처리 객체 GestureDetector

Scroll : 손가락으로 드래그하는 일반적인 경우에 해당, 이동한 거리값이 중요 처리 포인트

Fling :  빠른 속도로 스크롤 하는 경우, 이동한 속도값이 중요 처리 포인트

LongClikck :오랫동안 손가락을 누르고 있을 때 발생

FocusChange : 포커스가 변경 될 때 마다 호출

GestureDetector 객체는 이런 이벤트를 간단히 처리할 수 있도록 거리, 속도값 전달

 

액티비티 자체에 대한 이벤트를 처리 할때는 아래와 같은 메소드를 재정의 한다.

boolean onTouchEvent (MotionEvent event)

boolean onKeyDown (int KeyCode, KeyEvent event)

boolean onKeyUp (int KeyCode, KeyEvent event)

 

버튼이나 테스트뷰 와 같은 view들에 이벤트를 처리 할 때는 이벤트 리스터 함수를 등록한다.

view.onTouchListener

view.onKeyListener

view.onClickListener

view.onFocusChangeListener

by wisegirl 2013. 2. 27. 23:47

Content Provider는 안드로이드 애플리케이션 간에 데이터를 공유할 수 있는 유일한 수단이다.

안드로이드 패키지들이 공통적으로 접근할 수 있는 데이터 저장소는 따로 없음
데이터를 제공하는 저장소를 한 곳으로 통일시키고 클라이언트 들이 쉽게 접근할 수 있도록 만들어 주는 데이터 레이어

같은 애플리케이션 안 뿐만 아니라 다른 애플리케이션의 액티비티나 서비스도 접근가능
 

ㅇ 제공가능 데이터 타입: 오디오, 비디오, 이미지, 연락처 등
ㅇ 다양한 데이터 저장 매커니즘 지원가능 파일, SQLite데이터베이스, 메모리 상의 해쉬맵 등

 

* 구현하기

ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);

int count = cursor.getCount();
Toast.makeText(this,"데이터갯수: "+count, Toast.LENGTH_LONG).show();

String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);

 

menifest.xml ->  permissions -> add -> android.permission.READ_CONTACTS
까지 하면 menifest.xml 자동 추가됨 <user-permission> 이하내용...

 

정리하자면 ContentResolver라는 객체를 통해 query()메소드를 수행하여 데이터를 얻어 온다.
query()메소드의 리턴타입은 Cursor 이므로, 결국 ContentResolver를 통해 얻어 진 데이터는 Cursor의 객체형태로 저장된다.

by wisegirl 2013. 2. 22. 12:23

액티비티가 디스플레이 되어지는 화면 단위의 객체라면

서비스는 화면과 관계 없이 Backgroung로 구성되는 객체라고 할 수 있다.

 

서비스를 구현하기 위해 클래스를 생성하고 super class를 Service클래스를 선택한다.

Class myService extends Service{}

액티비티 클래스를 구현한다면 클래스 이름 뒤에 extends Activity라고 쓰는것 처럼.

오버라이드 함수 선택하기 ( 우클릭 -> source -> overide... -> onCreate()선택 )

 

서비스를 구동되는 내용들이 화면에 보여지지 않으므로 구현과정을 Log로 확인해 볼 수 있다.

Log.d 메소드를 이용할것

메소드 작성시 빨간줄이 뜬 경우 ctrl+shift+O 를 이용하여 사용할 메소드를 선택해 준다.

 

onCreate() 클래스 객체를 메모리에 로딩

onDestory() 메모리 상에서 제거

따라서 통상 개념적으로 간단히 생각하면 onCreate()에서 StartService를 구현해주고

onDestory()에서 StopService를 구현한다.

 

ㅇ서비스를 호출하고 종료하기

Intent myIntent = new Intent(getApplicationContext(), myService.class);

StartService(myIntent);

Intent myIntent = new Intent(getApplicationContext(), myService.class);

StopService(myIntent);

 

ㅇ서비스를 별도 서비스로 구동시키기

menifest.xml 파일에 <service>android:process=".remote"</service> 처럼 추가해 주면 별도 프로세스로 등록된다.

액티비티 혹은 어플종료시 별도로 서비스 종료를 해 주지 않을 경우 프로세스는 계속 유지된다.

by wisegirl 2013. 2. 19. 08:52

액티비티의 수명주기(Life Cycle)

액티비티의 상태는 (실행/ 일시정지/ 중지/ 소멸) 로 분류될 수 있다.

액티비티의 상태에 따라 내부적으로 그에 해당하는 함수들이 호출 되면서 상태를 바꾼다.

예를들면 onCreate(), onStart(), onPause()등

 

구동 -> onCreate(), onStar()t, onResume() -> [실행] <- onPause(), onResume() -> [일시정지]

[일시정지] -> onStop() -> [중지] -> onDestroy() -> [소멸]

[중지] -> onRestart(), onStart(), onResume() -> [(다시)실행]

 

기억해야 할 사항(1)

액티비티 상태가 화면에 디스플레이 되려할 때는 onResme()이 호출되고,

보여지던 화면이 뒤로 숨게 될 때에는 onPause()가 호출된다.

 

기억해야 할 사항(2)

액티비티 전환이 필요한 시점 사용자의 데이터를 임시로 저장해야 할 필요가 있다.

(예를들어 게임 진행 중 전화가 오는 경우, 전화 통화 종료 후 다시 게임 재개)

SharedPreferences 객체를 이용한다.

onPause()에서 구현할 부분은 getSharedPreference()를 이용하여 현재 상태 저장

String값을 저장할 경우 putString(); commit(); 의 순서로 구현

SharedPreferences myPref = getSharedPreferences("myPref", Activity.MODE_WORLD_WRITABLE);

SharedPreferences.Editor myEdit = myPref.edit(); 

myEditor.putString("name","홍길동");

myEditor.commit();

 

onResume()에서는 getSharedPreference를 이용하여 저장된 값을 불러오는 부분을 구현

SharedPreferences myPref = getSharedPreferences("myPref", Activity.MODE_WORLD_WRITABLE);

if(myPref != null && myPref.contains("name")) {

String name = myPref.getString("name","")

}

 

 

 

 

 

 

by wisegirl 2013. 2. 18. 13:29

액티비티는 간단히 한 화면을 나타내는 객체라고 생각 하면 된다.

그러나 하나의 액티비티가 항상 한 화면을 구성하진 않는다.

하나의 화면에 2개 이상의 액티비티로 구성될 수도 있다.

 

화면간의 전환 즉, 액티비티 간의 전환은 인텐트 라는 것을 통해 이루어 진다.

안드로이드 에서는 자바에서 처럼 한 화면에서 다음 화면을 바로 호출 할 수 없다.

액티비티a -> 인텐트(해석) -> 액티비티b

액티비티 간에 데이터를 주고 받는 경우에도 인텐트를 통해 이루어 진다.

StartActivityforResult() / SetResult()

 

ㅇ Explicit Intent: 호출할 대상이 확실

예) Intent myIntent = new Intent(getApplicationContext(), NewActivity.class)

ㅇ Implicit Intent: 호출할 대상이 명확하지 않고 가변적

예) 웹브라우저에 uri를 호출할 경우, 웹브라우저가 2개 이상 설치된 경우 어디를 호출?

 

대상 인텐트 객체를 지정할때 ComponentName 으로도 가능하다.

 

액티비티 스택과 플래그

액티비티는 스택구조로 관리됨, 동일한 액티비티를 여러 번 실행 한다면 동시에 데이터를 여러 번 접근 하거나 리소스를 여러번 사용하는 문제 발생 가능 -> 플래그

ㅇ FLAG_ACTIVITY_SINGLE_TOP

액티비티를 생성할 때 이미 생성된 동일한 액티비티가 있으면 그 액티비티를 그대로 사용하라는 의미

동일한 액티비티를 중복 생성 못함

ㅇ FLAG_ACTIVITY_NO_HISTORY

처음 이후에 실행된 액티비티는 액티비티 스택에 추가되지 않음

ㅇ FLAG_ACTIVITY_CLEAR_TOP

이 액티비티 위에 있는 다른 액티비티를 모두 종료

by wisegirl 2013. 2. 17. 22:51
| 1 2 3 |