[UMC 5기] Android 워크북 2주차

2023. 9. 29. 07:48·대외활동/UMC 동아리

Activity

Activity란

  • 화면에 표시되는 UI 구성을 위해 가장 기본이 되는 요소
  • 화면을 제어, 사용자 인터페이스를 구성
  • 앱은 화면에 UI를 표시하기 위해 최소 하나의 Activity를 가져야 함
  • 일반적으로 액티비티가 진입점 역할

 

새로운 Activity를 만들기 위해선

  1. Activity 생성
    • app - java - Package 마우스 우클릭 - New - Activity - Empty Activity - 이름짓기 - finish
    • app - java - Package 마우스 우클릭 - New - Kotlin Class/File - 이름짓기 - finish
  2. 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는 언제 사용?

  1. 액티비티에서 접근할 때
    • getSupportFragmentManager 사용
  2. 프래그먼트에서 접근할 떄
    • 호스팅 -> 자식 : getChildFragmentManager 사용
    • 자식 -> 호스팅 : getParentFragmentManager 사용

 


 

 

참고 사이트: 

https://recipes4dev.tistory.com/67

https://jhshjs.tistory.com/55

https://hongbeomi.medium.com/appcompatactivity-%ED%8C%8C%ED%97%A4%EC%B9%98%EA%B8%B0-4ed4fc231899

https://themach.tistory.com/37

https://hs5555.tistory.com/64

https://velog.io/@jhw970714/Android-ActivityMainActivityAppCompatActivity%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%BC%EA%B9%8C

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://velog.io/@minju0426/Android-%EC%95%94%EC%8B%9C%EC%A0%81-%EC%9D%B8%ED%85%90%ED%8A%B8-Implicit-Intent

https://limkydev.tistory.com/35

https://parkho79.tistory.com/176

https://lktprogrammer.tistory.com/182

https://lktprogrammer.tistory.com/182

https://jutole.tistory.com/2

https://yj95.tistory.com/8

https://medium.com/depayse/android-fragment-1-fragment%EC%9D%98-%EC%9D%B4%ED%95%B4%EC%99%80-%EC%83%9D%EC%84%B1-5cbfdc9b7f7c

https://kotlinworld.com/45

https://velog.io/@hanni66/BundlingAppBundle

https://jwsoft91.tistory.com/203

https://ardor-dev.tistory.com/76

https://velog.io/@changhee09/%EC%95%88%EB%93%9C%EB%A1%9C%EC%9D%B4%EB%93%9C-Fragment%EC%99%80-FragmentManager

 

'대외활동 > 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
'대외활동/UMC 동아리' 카테고리의 다른 글
  • [UMC 5기] Android 스터디 3주차
  • [UMC 5기] Android 워크북 3주차
  • [UMC 5기] Android 스터디 2주차
  • [UMC 5기] Android 워크북 1주차
월월
월월
  • 월월
    서벅돌의 성장일기
    월월
  • 전체
    오늘
    어제
    • 분류 전체보기 (121)
      • TIL (2)
      • Server (29)
        • spring (8)
        • node.js (16)
        • 기타 (5)
      • App&Web (17)
        • Web (1)
        • Android (16)
        • iOS (0)
      • 공부 (59)
        • 깃&깃허브 (3)
        • 파이썬 (17)
        • 유니티 (4)
        • 자료구조 | 알고리즘 (15)
        • 자바 (3)
        • 운영체제 (8)
        • AI와 데이터 (9)
      • 대외활동 (12)
        • NPC 동아리 (1)
        • UMC 동아리 (11)
      • 대학교 (1)
        • 교직 (1)
      • 기타 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 글 관리
  • 링크

  • 공지사항

    • Notice
  • 인기 글

  • 태그

    mysql
    java
    유니티
    자바
    파이썬
    Python
    안드로이드
    코틀린
    루아
    C
    Unity
    Android
    kotlin
    Lua
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
월월
[UMC 5기] Android 워크북 2주차
상단으로

티스토리툴바