선택 위젯에서 어댑터는 데이터 관리 객체.

데이터 추가/삭제 등의 관리를 위해 setData(), getData()메소드 구현하여 이용

 

스피너 (Spinner)

<Spinner

   android:id

/>

spin.setAdapter()메소드로 어댑터 설정

ArrayAdapter<String> aa = new ArrayAdapter<String>{

   this, android.R.layout.simple_spinner_item, items);

aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);

}

onItemSelected(AdapterView<?> parent, View v, int position, long id)

 

그리드 뷰 (Grid view) : 테이블 모양으로 데이터를 표현 (ex:월별 캘린더)

class DataGridView extends GridView{}

grid = new DataGridView(this);

grid.setAdapter();

 

갤러리 (Gallery) : 단말 내 앨범의 이미를 선택하여 불러올때 이용됨

<Gallery

   android:id

/>

gallery = (Gallery) findViewById(R.id.gallery)

gallery.setAdapter(new ImageAdapter(getApplicationContext()));

gallery.setOnItemClickListener(new OnItemClickListener(){}

by wisegirl 2013. 3. 6. 22:21

여러 개의 아이템 중에서 하나를 선택하도록 하는 위젯을 선택 위젯 이라고 함

선택 위젯은 어댑터(Adapter)를 사용하여야 함

이 어댑터에서 데이터를 관리하도록 해야 할 뿐만 아니라 화면에 보여지는 뷰도 getVeiw()메소드에서 결정함

선택위젯의 가장 큰 특징은 원본 데이터를 위젯에서 직접 설정하지 않고 어댑터라는 클래스를 사용하도록 되어 있다는점

어댑터가 데이터 관리 (getCount, getItems, getItemId, getVeiw)

리스트는 껍데기

 

선택 위젯으로 리스트뷰, 스피너, 그리드뷰(테이블 모양), 갤러리 등을 구현할 수 있음

 

<ListView

   android:id="@+id/list"

   android:layout_width

   android:layout_height

/>

 

LiseView list = (ListView) findViewById(R.id.list);

MyAdapter adapter = new MyAdapter();

list.setAdapter(adapter);

//리스트(껍데기)를 만들고, 리스트 객체에 어댑터(데이터)를 결합한다.

 

어댑터를 별도의 클래스(파일)로 만들어서 이용할 수 있음. 생성자로 Context 객체 전달

Class MyAdapter extends BaseAdapter //데이터 관리하는 어댑터 클래스, View 를 리턴 ex)TextView, LinearLayout

{

   Context mcontext;

   String[] names = {"홍길동", "이성계", "정도전", "세종대왕"};

   public MyAdapter(Context context)

      mcontext = context;

   public int getCount()

      return names.length;

   public Object getItems(int position)

      return names[position];

   public long getItemId(int position)

      return position;

   public View getView(int position, View convertView, ViewGroup parent)

   //getView메소드에서 View 객체에 LinearLayout 등을 리턴할 수 있다. 내부에 이미지, View등을 결합가능

      TextView text = new TextView(getApplicationContext());

      text.setText(names[position]);

      return text; 

}

 

Layout 역시 별도의 클래스(파일)로 만들어서 이용할 수 있음.

Class CustomerItemView extends LinearLayout{}

액티비티 에서는 SetContextVeiw()를 통해 xxx.xml 파일을 로딩하여 화면구성을 인플레이션 할수 있음

그러나 액티비티가 아닌 Layout을 상속받는 클래스에서는 SetContentView()로 인플레이션 할수 없음

따라서, 수동으로 인플레이션 코드를 작성해 주어야 함.

private void init(Context context)

LayoutInflater inflater = (LayoutInflater) context.getSystemService(ACTIVITY.LAYOUT_INFLATER_SERVICE);

inflater.inflate(R.layout.customer, this, true);

by wisegirl 2013. 3. 6. 09:17
절대 레이아웃, 테이블 레이아웃은 자주 사용될 것 같지 않아 생략.
(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

 

저희는 집에서 우유와 발효유 요거트를 함께 직접 요거트를 발효해 먹고 있어요.

 

그 동안은 전통적(?) 방식으로 우유와 요거트를 섞어서 전기장판 아래에 하루동안 두는 방식으로 해 왔어요.

 

그런데 전기세 부담과 출근하고 집을 비우는 동안 전열기를 켜 두고 나온다는 것도 좀 그렇더라구요.

 

그래서 발효기계를 찾던중 저의 요구사항에 꼭 맞는 제품을 발견 하였습니다.

 

마음에 드는점은 가격, 편의성, 생산용량 등 제 마음에 꼭 들어요.

 

사진 나갑니다.

 

 

크기도 딱 정당하고 공간차지도 최소화 되는것 같아서 마음에 들어요, 게다가 가볍구요..

 

 

요렇게 뚜껑을 열고 내부 플라스틱 통에 다가 우유 100ml와 유산균 발효유를 1통 넣으시면 되요.

통이 보기엔 작아 보이는데 모두 부으면 가득 차기 직전까지... 넘치지 않고 꼭 맞는 양이 되더라구요.

 

 

짠~ 딱 8시간 동안 발효하고 출근하면서 냉장고에 넣두고 차갑게 숙성시킨 후의 모습이에요.

8시간 이면 그리 오래 발효 하지 않은것도 아닌데도 국자로 덜어 보니 단단하게~ 아주 만족스럽게 발효 되어 있더라구요.

정말 만족 대 만족입니다!! ^^

 

완성된 사진 좀더 크게 보여드릴게요.

 

 

여러분도 저렴한 가격에 사정용 수제 요거트 발효기로~ 맛과 영양 모두  챙겨 보세요^^

 

 

by wisegirl 2013. 2. 22. 12:49

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
| 1 2 3 4 5 6 ··· 8 |