Activity
Activity란
- 화면에 표시되는 UI 구성을 위해 가장 기본이 되는 요소
- 화면을 제어, 사용자 인터페이스를 구성
- 앱은 화면에 UI를 표시하기 위해 최소 하나의 Activity를 가져야 함
- 일반적으로 액티비티가 진입점 역할
새로운 Activity를 만들기 위해선
- Activity 생성
- app - java - Package 마우스 우클릭 - New - Activity - Empty Activity - 이름짓기 - finish
- app - java - Package 마우스 우클릭 - New - Kotlin Class/File - 이름짓기 - finish
- manifests 파일에 Activity 추가
- app - manifests - AndroidManifest.xml - <activity/> 추가
<application>
// 중간 코드생략
<activity
android:name=".추가한 액티비티명"/>
</application>
AppcompatActivity란
- 안드로이드의 하위버전을 지원하는 Activity의 일종
- 본래 Activity 클래스는 최신버전의 안드로이드만 지원
- AppCompatActivity 클래스를 사용하면 최신버전에서 지원하지 않는 것도 지원 가능해짐
- 여러 하위버전이 얼마나 커버하는지 매번 확인하는 번거로움을 줄여서 개발자의 수고를 덜어줌
- 사용 예시
import androidx.appcompat.app.AppCompatActivity
class MainActivity : AppCompatActivity() {
}
Activity-Layout 결합
findViewById
- resource id를 통해서 레이아웃에 있는 뷰 객체들 중 일치하는 뷰를 가져오는 메소드
- 하나의 변수를 선언하여 하나의 뷰를 연결해줌
findViewById 사용법
// 1. 하나의 변수를 선언해주고 findViewById를 사용해서 xml에 있는 View를 가져올 수 있음
val 변수 = findViewById<원하는 뷰>(id값)
// 2. 가져오는 뷰가 텍스트 뷰라면 원하는 뷰에 TextView를 적고 id값을 적어주면 됨
val textView = findViewById<TextView>()
// 3. resource파일에 있는 id값을 가져오고 해당 id값을 적어주면 됨 (R은 resource파일의 첫글자인 R)
val textView = findViewById<TextView>(R.id.id명)
// 4. 해당 뷰 활용
textView.text = 'hello'
ViewBinding
- 레이아웃 XML 파일에 선언한 뷰 객체를 코드에서 쉽게 이용하는 방법
- 레이아웃 XML 파일에 대한 액티비티 클래스를 정의하지 않고 자동적으로 view에 대한 연결을 생성
ViewBinding 사용법
1. app/build.gradle 파일에 뷰바인딩 추가
- build.gradle(Module:app) (Groovy DSL)
android {
// (... 생략 ...)
viewBinding {
enabled = true
}
}
- build.gradle.kts (Kotlin DSL)
android {
// (... 생략 ...)
buildFeatures {
viewBinding = true
}
}
2. 우측 상단 Sync Now 클릭
3. 액티비티에 추가
class MainActivity : AppCompatActivity() {
private lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root) // activity_main.xml의 맨 위(root) 레이아웃 가져옴 (하위 요소들 모두 포함됨)
binding.tvText.text = "hello"
}
}
- activity 레이아웃 파일명으로 만들어지는 바인딩 클래스명 -> 자동 네이밍
- 언더바( _ ) 사라지고 각 앞문자는 대문자로 바꾸고 맨 뒤에 Binding 추가
- ex ) activity_main.xml -> ActivityMainBinding
- inflate : XML 파일을 읽어와 해석하겠다는 의미
- layoutInfalter : 객체화한 뷰를 해석해서 읽어와 객체화를 해줌
findViewById보다 ViewBinding이 권장되는 이유
findViewById의 장점
- Android 초기부터 사용되었으며 별다른 설정없이 사용 가능
- Runtime에 동작하여 빌드 속도에 영향 없음
ViewBinding의 장점
- 자동으로 형변환을 하여 별다른 형변환을 할 필요 없음
- 레이아웃 내에 있는 View만을 찾아 정확한 view 타입을 맵핑해, Type-Safe를 보장
- 레이아웃에 없는 id를 접근했을 때 NullPointerException을 방지해 Null-Safe를 보장
- 오류가 나면 런타임이 아닌 컴파일 시 빌드 오류를 알려줌
- 코드의 가독성이 떨어지는 문제 해결
새로운 Activity를 띄우는 방법
Intent란
- 컴포넌트끼리 통신하기 위해 사용하는 메시징 매커니즘
- 안드로이드 컴포넌트 사이의 통신 수단
- 다른 앱 구성요소로부터 작업을 요청하는데 사용
Intent를 사용하여 Activity 간 데이터를 전달하려면
1. Intent 선언 (전달할 Activity에서)
val intent = Intent(this, 전달할 액티비티명::class.java)
2. extra 필드 사용하여 전달할 데이터 저장 (전달할 Activity에서)
intent.putExtra(key: String, value: Int)
intent.putExtra(key: String, value: String)
intent.putExtra(key: String, value: Serializable)
3. 전달 (전달할 Activity에서)
// 일반
startActivity(intent)
// 반환 결과 확인하고 싶을 떄
startActivityForResult(intent, DETAIL_ACTIVITY_CODE)
4. Intent에 저장한 Extra 필드 값 읽기 (전달받은 Activity에서)
intent.getIntExtra(key: String, defaultValue: Int)
intent.getStringExtra(key: String)
intent.getSerializableExtra(key: String)
5. 반환 결과 확인 (전달했던 Activity에서 && startActivityForResult 사용했을 때)
override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
when (requestCode) {
DETAIL_ACTIVITY_CODE -> {
if (resultCode == RESULT_OK) {
}
if (resultCode == RESULT_CANCELED) {
}
}
}
}
명시적 Intent와 암시적 Intent
명시적 Intent란
- 실행 대상을 명확히 지정
- Intent를 충족하는 애플리케이션이 무엇인지 명시
- 인텐트에 클래스 객체나 컴포넌트 이름을 지정하여 호출될 대상을 확실히 알 수 있음
- 실행하고자 하는 Component 클래스명을 Intent에 담음
- 보통 동일 앱 안에서 구성요소를 시작할 때 사용
암시적 Intent란
- 적절한 대상의 조건만을 지정하여 호출
- 호출될 대상의 속성들을 지정했지만 호출될 대상이 달라질 수 있는 경우
- 다른 응용 프로그램의 컴포넌트를 호출할 때 사용
- 수행할 일반적인 작업을 선언하여 다른 앱의 구성요소가 이를 처리할 수 있도록 함
두 Intent를 사용하는 예시
- 명시적 Intent : 버튼 클릭 시 원하는 액티비티 실행
binding.button.setOnClickListener {
val intent = Intent(this, DetailActivity::class.java)
startActivity(intent)
}
- 암시적 Intent : 지도보기, 연락처보기, 인터넷, SNS 공유, 카메라
val intent = Intent(Intent.ACTION_DIAL, Uri.parse("tel:012-3456-7890"))
startActivity(intent)
Fragment
Fragment의 정의
한 화면에 있던 UI 들을 조각이라는 단위로 재배치 하는 것
Fragment를 사용하는 이유
- 태블릿 등 크기 큰 디바이스가 나오면서 Acitivity라는 단위만으로는 화면을 처리하기 어려워졌음
- UI 구성을 모듈 단위(조각)으로 나누어 독립성을 추가해줌
- 액티비티 실행 중에도 화면에 동적으로 추가되거나 다른 Fragment로 교체가 가능
- 레이아웃을 분리 관리할 수 있음
- 액티비티의 화면 구성을 위한 레이아웃의 복잡도도 줄일 수 있
새 Fragment는 어떻게 만드는가
Fragment
1. Activity 생성
- app - java - Package 마우스 우클릭 - New - Fragment - Fragment (Blank) - 이름짓기 - finish
- app - java - Package 마우스 우클릭 - New - Kotlin Class/File - 이름짓기 - finish
2. Fragment 상속
class ExampleFragment : Fragment() {
}
3. onCreateView() 함수 재정의
class ExampleFragment : Fragment() {
lateinit var binding : FragmentExampleBinding
override fun onCreateView(
inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = FragmentExampleBinding.inflate(inflater, container, false)
return binding.root
}
}
Fragment는 어떻게 화면에 보이게 하는가
레이아웃 XML에 FrameLayout을 만들고 그 안에 넣는다
<FrameLayout
android:id="@+id/frameLayout"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_marginStart="10dp"
android:layout_marginEnd="10dp"
app:layout_constraintBottom_toTopOf="@+id/fragment1"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_goneMarginTop="10dp"/>
Bundle
Bundle은 무엇인가
- 여러 가지 타입의 값을 저장할 수 있는 클래
- 앱의 실행을 위해 필요한 파일들을 하나의 묶음으로 만드는 것을 의미
- Map 형태로 구현된 데이터 묶음
Intent와 Bundle을 결합하는 방법
- extra 필드 사용하여 전달할 데이터 저장
- 이 때 입력되는 extra가 바로 Bundle 객체
Intent 내부 함수 - Bundle을 통해 데이터 전달하고 있음
public @NonNull Intent putExtra(String name, @Nullable String value) {
if (mExtras == null) {
mExtras = new Bundle();
}
mExtras.putString(name, value);
return this;
}
Intent와 Bundle 결합한 방법
val intent = Intent()
val bundle = Bundle()
bundle.putString("key","value")
intent.putExtra("bundle",bundle)
FragmentManager
FragmentManager란
- 앱 프래그먼트에서 프래그먼트를 추가, 삭제 또는 교체하고 백 스택에 추가하는 등의 작업을 실행하는 클래스
- FragmentActivity를 통해 획득 가능
FragmentManager는 언제 사용?
- 액티비티에서 접근할 때
- getSupportFragmentManager 사용
- 프래그먼트에서 접근할 떄
- 호스팅 -> 자식 : getChildFragmentManager 사용
- 자식 -> 호스팅 : getParentFragmentManager 사용
참고 사이트:
https://recipes4dev.tistory.com/67
https://hongbeomi.medium.com/appcompatactivity-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-4ed4fc231899
https://themach.tistory.com/37
https://velog.io/@ows3090/Android-findViewById-%EC%9B%90%EB%A6%AC
https://parkjh7764.tistory.com/150
https://heeeju4lov.tistory.com/39
https://jeong9216.tistory.com/6
https://goni95.tistory.com/107
https://parkjh7764.tistory.com/151
https://limkydev.tistory.com/35
https://parkho79.tistory.com/176
https://lktprogrammer.tistory.com/182
https://lktprogrammer.tistory.com/182
https://velog.io/@hanni66/BundlingAppBundle
https://jwsoft91.tistory.com/203
https://ardor-dev.tistory.com/76
'대외활동 > UMC 동아리' 카테고리의 다른 글
| [UMC 5기] Android 스터디 3주차 (0) | 2023.09.29 |
|---|---|
| [UMC 5기] Android 워크북 3주차 (0) | 2023.09.29 |
| [UMC 5기] Android 스터디 2주차 (0) | 2023.09.24 |
| [UMC 5기] Android 워크북 1주차 (0) | 2023.09.22 |
| [UMC 5기] Android 스터디 1주차 (0) | 2023.09.20 |