개발자 끄적끄적

위젯, 리소스 본문

안드로이드 프로그래밍

위젯, 리소스

햏치 2023. 4. 10. 01:01

<TextView와 EditText>
- TextView는 텍스트를 출력하기 위한 위젯
- EditText는 텍스트를 입력받기 위한 위젯
- EditText는 TextView를 상속하기 때문에 TextView의 속성을 그대로 사용
- 텍스트 외형을 속성을 사용해 변경할 수 있다
  - android:text 실제 표시될 텍스트
  - android:textSize 텍스트 크기, 단위는 'sp'(dp보다는 sp를 권장)
  - android:textStyle 굵은글씨(bold), 기울임글씨(italic)
  - android:textColor 텍스트 색
  - android:textAlignment 좌, 우, 중앙 정렬
  - android:singleLine 강제로 한 줄 표시
  - android:ellipsize 텍스트 출력할 공간이 부족할 경우 '...' 표시 (singleLine과 함께 사용)

- EditText에서 주로 사용하는 속성 : TextView의 속성을 다 사용할 수 있다
  - android:ems 입력 받을 글자 수, 즉 EditText의 가로 크기
  - android:hint 입력 내용이 없을 때 표시되는 힌트
  - android:inputType 입력 받을 텍스트 종류(숫자, 패스워드, 이메일, 전화번호 등)
    - 패스워드일 경우 입력한 글자 대신 * 가 표시됨



<리소스>
- 앱 소스 코드에서 사용되는 정적 콘텐츠
- 비트맵, 레이아웃, 문자열, 애니메이션 등
- 리소스를 소스 코드와 분리하여 관리하는 이유
  - 특정 기기 구성이나 설정에 따라 다른 리소스를 사용하도록 하여
  - 다양한 상황에 대처할 수 있음
  - 예를 들어 언어 설정에 따라 문자열을 다르게 사용
  - 화면 크기나 비율에 따라 다른 레이아웃을 사용
  - 나이트 모드에 따라 다른 색 조합을 사용



<리소스 한정자(qualifier)>
- 소스 코드에서 리소스에 접근할 때 기기구성이나 설정에 따라 리소스 파일을 자동으로 선택하게 함
  - 예를 들어 기기 방향(orientation)에 따라 사용할 레이아웃 XML을 별도로 만들 수 있다
  - 예를 들어 언어 설정(Locale)에 따라 사용할 문자열 리소스 파일을 언어 마다 별도로 만들수 있다



<리소스 새로 만들기>
File > New > Android Resource
- File
  - File name: 리소스 파일 이름 
  - Resource type: drawable, layout, menu, mipmap, navigation, values, animation 등
  - Root element: type에 따라 달라짐
  - Source set: main, debug용, release용
  - Directory name: 리소스 파일이 생성될디렉토리, 기본을 사용하면 된다
  -  Available qualifiers: 필요한 한정자추가



<리소스 관지자>
- Project의 res\ 폴더에서 리소스를 관리할 수도 있으나
- 툴 윈도우의 Resource Manager를 사용하여 리소스를 관리할 수도 있음



<리소스 - 문자열>
- 앞의 예에서 android:text와 android:hint 속성의 값을 문자열이 아닌 @string/xxxx를 사용
  - 문자열을 직접 쓸 수도 있지만, 리소스에 정의해 둔 문자열의 ID를 쓰는 것을 권장한다

- 이렇게 문자열을 리소스로 관리하고 문자열이 필요한 곳에서 ID를 참조하도록 하면
  - 시스템 언어 설정에 따라 해당 언어가 자동으로 표시되어 다국어 버전 앱 만들 때 유용하다

- 문자열 리소스 XML
  - src/main/res/values/strings.xml
<resources>
<string name="app_name">prog_ui</string> //tag이름이 string이어야 한다
<string name="long_text">Android Studio provides the fastest tools for
building apps on every type of Android device</string>
<string name="bold_italic">bold and italic</string>
</resources>
  - 다른 리소스 XML에서 @string/app_name 으로 참조할 수 있다

- 다국어 지원을 위해 언어마다 문자열 리소스를 정의
  - 기본 언어 문자열 정의는src/main/res/values/strings.xml
  - 특정 언어(한국어)의 문자열 정의는 src/main/res/values-ko-rKR/strings.xml
  - 안드로이드 스튜디오의 문자열 에디터를 사용하면 손쉽게 여러 언어 문자열 관리할 수 있다
    - strings.xml을 오픈하고 오른쪽 위의 [Open editor] 링크를 클릭하면 Translations Editor가 나타남
    - 빨간 표시된 버튼을 눌러서 언어 추가

- 시스템 언어 설정에 따라 문자열에 다르게 표시된다

- 소스코드에서 문자열 리소스 사용
- ex)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val appName = resources.getString(R.string.app_name)
println(appName)



<스타일과 테마(Style & Theme)>
- 스타일은 위젯의 외형과 관련된 속성(색깔, 크기 등)을 하나의 세트로 만들어 둔 것
- 미리 만들어 둔 스타일을 위젯의 스타일로 지정하면 해당 속성이 모두 적용됨
- 스타일 파일 src/main/res/values/styles.xml에서 mytextview 라는 스타일을 정의
- ex)
<?xml version="1.0" encoding="utf-8"?>
<resources> //android sdk에 포함된 속성이 아니라 'android'가 없다
<style name="mytextview"> //스타일의 이름
<item name="android:textSize">24sp</item> //속성
<item name="android:textColor">#000000</item> //속성
</style>
</resources>

- 위젯 정의할 때 style 속성으로 지정
- ex)
<TextView
android:layout_width="match_parent" android:layout_height="wrap_content" //android sdk에 포함된 속성
style="@style/mytextview"
android:text="@string/long_text"/>



<스타일과 테마(Style & Theme)>
- 테마는 앱 전체에 적용되는 스타일
- 스타일과 같은 형식으로 정의, 위젯의 속성 뿐 아니라 테마 색을 지정할 수 있음
- 보통 테마를 위한 스타일 파일은 src/main/res/values/themes.xml
- @color는 src/main/res/values/colors.xml에 color 리소스로 정의됨
- 테마는 AndroidManifest.xml의 application 태그의 android:theme 속성으로 지정함
- ex)
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.Prog_ui">
<activity android:name=".MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>



<Values 리소스 - String Array>
- 리소스 정의
  - res/values/filename.xml
  - ex) strings.xml arrays.xml
  - ex)
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string-array name="planets_array">
<item>Mercury</item>
<item>Venus</item>
<item>Earth</item>
<item>Mars</item>
</string-array>
</resources>

- 리소스 사용
  - 소스 코드에서 사용
  ex) val array:Array = resources.getStringArray(R.array.planets_array)



<Values 리소스 - 기타>
- bool
- color
- dimen(깊이, 크기)
- Integer
- Integer-Array



<ImageView>
- 이미지를 표시하는 위젯
- ImageView에서 보여줄 이미지는 app:srcCompat 속성으로 지정
- 이미지는 src/main/res/drawable/ 밑에 복사 함
  - src/main/res/drawable/bench_under_tree.jpg 이미지 파일이 있다면 다음과 같이 지정

- 이미지 크기가 ImageView 보다 크거나 작을 경우 scaleType을 지정하여 표시되는 이미지 크기 변경

- ScaleType 종류
  - center, centerCrop, centerInside, fitCenter, fitEnd, fitStart, fitXY, matrix



<ScrollView>
- 자식 뷰가 클 경우 스크롤 가능하도록 만듦
- 세로 스크롤 동작이 기본
- 가로 스크롤을 하려면 HorizontalScrollView를 사용
- ex)
<ScrollView
android:layout_width="match_parent"
android:layout_height="wrap_content">
<ImageView
android:id="@+id/imageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:contentDescription="@string/bench_under_tree"
android:scaleType="center"
app:srcCompat="@drawable/bench_under_tree" />
</ScrollView>



<RadioButton>
- RadioGroup의 자식 View로 RadioButton을 사용하면 자식 RadioButton들 중 하나만 선택이 됨
- ex)
<RadioGroup
android:id="@+id/radioGroup"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<RadioButton
android:id="@+id/radioDog"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/dog" />
<RadioButton
android:id="@+id/radioCat"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cat" />
</RadioGroup>



<라디오 버튼 상태 변경/읽어오기>
- ex)
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val button = findViewById<Button>(R.id.button)
val radioGroup = findViewById<RadioGroup>(R.id.radioGroup)
radioGroup.check(R.id.radioDog) // 라디오 버튼 상태 변경
button.setOnClickListener {
when(radioGroup.checkedRadioButtonId) { // 라디오 버튼 상태 읽어오기
R.id.radioDog -> println("radioDog")
R.id.radioCat -> println("radioCat")
      } 
    }
  }
}



<Button>
- 버튼
<Button
android:id="@+id/button" //id 지정
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:text="@string/action" />
  - android:id 를 지정해둬야 프로그램 코드에서 해당 객체를 가져올 수 있음
  - @+를 붙이는 이유는 미리 정의하지 않은 상수이기 때문에 새로 생성하도록하는 지시 임




<버튼 클릭으로 위젯 내용 변경>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
val imageView = findViewById<ImageView>(R.id.imageView)
val button = findViewById<Button>(R.id.button)
val radioDog = findViewById<RadioButton>(R.id.radioDog)
val radioCat = findViewById<RadioButton>(R.id.radioCat)
val textView2 = findViewById<TextView>(R.id.textView2)
val editTextTextPersonName = findViewById<EditText>(R.id.editTextTextPersonName)

imageView.scaleType = ImageView.ScaleType.CENTER

button.setOnClickListener {
val pet = "Dog:${radioDog.isChecked}, Cat:${radioCat.isChecked}"
textView2.text = editTextTextPersonName.text
Snackbar.make(it, pet, Snackbar.LENGTH_SHORT).show()
    }
  }
}

'안드로이드 프로그래밍' 카테고리의 다른 글

Activity, Intent  (0) 2023.04.15
안드로이드 레이아웃(LayOut)  (0) 2023.03.30
코틀린FP  (0) 2023.03.23