안드로이드에서 화면 출력을 위한 단위 Activity
Activity 위에 View를 배치해서 출력
Activity Class 의 onCreate 메소드에서 setContentView(int resId 또는 View view)를 호출하면 됩니다.
resId 는 리소스 아이디의 줄임말인데 res 디렉토리에 자원을 생성하면 안드로이드가 R.java라는 파일을 만들고 그 파일에 id를 생성해서 연결한 것입니다.
R. 으로 시작하는 ID는 프로젝트에 삽입한 자원이고 android.R. 으로 시작하는 ID는 안드로이드가 제공하는 자원입니다.
- View 를 대입하고자 하는 경우는 코드로 생성해서 대입해야합니다.
6.0 이상 동적 권한: 앱에서 권한 부여가 안되서 쓰지 못할 수 있으니 6.0 이상으로 잡아야한다.
View 의 종류
ViewGroup (여러개의 View 를 모아서 출력: Layout(원하는 모양을 마음대로 조합), Adapter View(동일한 모양의데이터를 출력하기 위한 뷰)
Fragment (작은 Activity - 모아서 하나의 Activity를 구성)
View (Widjet - 단독으로 출력)
=> 전체에 Layout이나 AdapterView를 배치하고 그 위에 Widjet이나 View Group을 배치해서 화면 출력을 합니다.
XML 로 디자인 하는 이유
구조 파악이 쉽기 때문이다.
기본 View
TextView : 문자열 출력을 위한 뷰
EditView : 문자열 입력을 위한 뷰 (키보드 사용 가능)
ImageView : 이미지 출력을 위한 뷰
Button : 클릭해서 어떤 동작을 취하기 위한 뷰
뷰들은 속성을 이용해서 모양이나 이벤트 처리를 합니다.
필수 속성 : layout_width(너비) 와 layout_height(높이)
match_parent(부모 전체 영역)
wrap_content(콘텐츠의 크기 만큼)
숫자 단위
id 속성 : 다른 뷰와 관계 설정을 위해서 또는 Kotlin 코드에서 사용하기 위해서 입니다.
@+id/아이디 로 설정합니다.
<TextView
android:id="@+id/txt/"/>
xml 파일에 디자인한 뷰를 Activity에서 사용하기
1. id를 직접 찾아서 뷰로 변환
val txt:TextView = findViewBuId(R.id.txt)
val txt = findViewBuId(R.id.txt) as TextView
2.id를 Activity 의 property 자동 추가하기
build.gradle 파일의 plug in에 kotlin-android-extensions를 추가하고 설치를 해야합니다.
activity 파일에 import kotlinx.android.synthtic.main.레이아웃.*
키보드 관리
InputMethodManager 클래스의 인스턴스를 이용합니다.
InputMethodManager 클래스의 인스턴스는
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager 로 생성
getSystemService 를 이용해서 생성하는 인스턴스는 시스템이 관리하고 Singleton 으로 만들어주기 위해서 직접 생성을 못하게 합니다.
키보드 출력
InputMethodManager.showSoftInput(키보드 입력을 받을 View, 0)
키보드 숨기기
InputMethodManager.hideSoftInputFromWindow(키보드 제어권을 뺏어올 뷰의 Token - View.getWindowToken(),0)
키보드 출력 때문에 다른 뷰가 가려지거나 화면이 보이지를 않는 경우에 키보드 문제를 해결
- 빈 화면을 터치하면 키보드를 숨기기
- return 키를 터치하면 키보드를 숨기기
- 키보드가 올라오는 Notification이 발생하면 이 때 하단의 뷰를 상단으로 이동하고 키보드가 숨겨지는 Notification이 발생하면 다시 하단으로 이동
Layout
서로 다른 뷰들을 모아서 출력하기 위한 뷰
배경색 지정할 수 있지만 자체 출력은 안됩니다.
다른 뷰나 뷰 그룹을 포함하는 역할을 수행
1. 종류
1) AbsoluteLayout: 좌표와 크기를 마음대로 설정할 수 있는 레이아웃
deprecated 되었는데 이유는 멀티해상도에 적용하기가 어렵다
2) LinearLayout : 수평 또는 수직 방향으로 뷰들을 배치하는 레이아웃
Layout_weight 라는 속성을 이용해서 뷰의 비율을 설정할 수 있습니다.
일정한 비율을 갖는 뷰들을 출력할 때 유용
3)FrameLayout: 왼쪽 상단을 기준으로 배치하는 레이아웃
여러개의 뷰를 배치하면 뷰가 겹쳐져서 출력 됩니다
visivility 속성을 이용해서 숨기거나 출력하는 형태로 사용
4) TableLayout: 표 형태의 Layout, 가로나 세로방향의 크기가 동일한 형태
=> 약간의 변화를 가해서 셀 병합을 할 수 있는 GridLayout이 추가 됨
5) RelativeLayout : 부모 뷰나 다른 뷰와의 관계를 이용해서 배치하는 레이아웃
제약조건 등을 추가할 수 있는 ConstraintLayout이 추가 됨
LauncherActivity 추가하여 연습가능
2. LinearLayout
수평이나 수직 방향으로 일정한 비율을 가지고 뷰를 배치하는 레이아웃
orientation을 이용해서 배치 방향을 설정 - vertcal, horiaontal
gravity 속성을 이용해서 맞춤을 설정
gravity : 자식 뷰의 맞춤을 설정
layout_gravity : 부모 뷰로 부터 자신의 맞춤을 설정
weight 속성을 이용해서 비율을 설정
orientation과 반대 방향으로 설정
0을 설정하면 자신의 크기대로 출력
그 이외의 양수는 전체 합에서의 비율
필요한 이미지 파일을 drawable 디렉토리로 복사
Relative Layout
다른 뷰 또는 부모와의 관계를 이용해서 뷰를 배치하는 기법
부모는 상관이 없지만 다른 뷰와의 관계로 표시하려면 기준이 되는 뷰에는 id 가 설정 되어 있어야 합니다.
layout_alignParent? : 부모와의 관계로 배치
layout_above : 다른 뷰와의 관계로 배치합니다.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical">
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/edit"/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/keyboardshow"
android:text="키보드 보이기"
/>
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/keyboardhide"
android:text="키보드 숨기기"
/>
</LinearLayout>
package kr.co.tjoeun.ui
import android.content.Context
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.inputmethod.InputMethodManager
import android.widget.EditText
import kotlinx.android.synthetic.main.activity_main.*
//activity_main.xml 파일에 디자인한 뷰들을 Activity 의 프로퍼티로 추가
class MainActivity : AppCompatActivity() {
//edit을 대입 받기 위한 변수
//var edit: EditText? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//layout 파일을 전개해서 Layout 파일에 디자인 한 내용을 메모리에 적재하는 동작
setContentView(R.layout.activity_main)
//edit라는 id 로 만들어진 EditText를 가져오기
//edit = findViewById(R.id.edit)
//속성 설정이나 가져오기
//코틀린은 property의 개념을 갖습니다.
//get 메소드와 set메소드를 이용해도 되고 프로퍼티 이름을 직접 사용하는 것도 가능
// edit.setText("테스트 설정")
//keyboardshow 를 눌렀을 때 수행할 내용
keyboardshow.setOnClickListener {
val imm:InputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
//키보드 출력 - 키보드를 누르면 문자가 edit 에 출력
imm.showSoftInput(edit, 0)
}
keyboardhide.setOnClickListener {
val imm:InputMethodManager =
getSystemService(Context.INPUT_METHOD_SERVICE) as InputMethodManager
//키보드 숨기기 - edit에 설정된 키보드를 숨기기기
imm.hideSoftInputFromWindow(edit.windowToken, 0)
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".LayoutActivity">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="기준"
android:textSize="36sp"
android:id="@+id/base"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="오른쪽 배치"
android:textSize="36sp"
android:layout_toRightOf="@+id/base"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="아래 오른쪽 배치"
android:textSize="36sp"
android:layout_below="@+id/base"
android:layout_alignParentRight="true"/>
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity"
android:orientation="vertical"
>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:layout_gravity="right|center_vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="랜덤으로 번호 생성"
android:textSize="24sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="랜덤으로 번호를 생성합니다"
/>
</LinearLayout>
<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
app:srcCompat="@drawable/random"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:layout_gravity="right|center_vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="별자리로 번호 생성"
android:textSize="24sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="뱔자리로 로또 번호를 생성합니다"
/>
</LinearLayout>
<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
app:srcCompat="@drawable/constellation"/>
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:orientation="horizontal"
android:layout_gravity="right|center_vertical">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center"
android:orientation="vertical">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이름으로 번호 생성"
android:textSize="24sp"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="이름으로 로또 번호를 생성합니다"
/>
</LinearLayout>
<ImageView
android:layout_width="140dp"
android:layout_height="140dp"
app:srcCompat="@drawable/name"/>
</LinearLayout>
</LinearLayout>
'안드로이드' 카테고리의 다른 글
안드로이드 : GUI 시스템에서 UI 갱신과 Logcat (0) | 2020.10.27 |
---|---|
안드로이드 : 레이아웃과 이벤트 처리 (0) | 2020.10.27 |
안드로이드 프로젝트 구성 (0) | 2020.10.22 |
안드로이드 native app 개발 환경 구축하기 (0) | 2020.10.21 |
안드로이드 초기 진입 코드와 상속 (0) | 2020.10.15 |