여러 객체

Dev.nuts·2021년 6월 14일
0

Android

목록 보기
3/5

SharedPreferences :

파일 형태로 데이터를 저장. 데이터는 (key, value) 형태로
data/data/패키지명/shared_prefs 폴더 안에 xml 파일 저장.
해당 파일은 어플리케이션이 삭제 되기전까지 보존된다.

-> 속도가 빠르기 때문에 간단한 저장을 할 경우에 많이 사용.
-> 보통 초기 설정 값이나, 자동 로그인 여부를 판별하기 위한 체크용도, 토큰 값 저장에 쓰임.
-> 앱을 꺼도 데이터가 유지된다는 점에서 간편한 데이트베이스 역할을 함.
-> 앱의 어디서든 전역적으로 사용하기 때문에, 싱글톤 패턴을 사용해서 어디서든 접근 가능하게 만드는 것이 좋다.


viewBinding :

코틀린 익스텐션이 deprecated 되면서, 소스코드에서 id.attribute 의 형태를 사용하지 않는 것을 권장하고 있다.
안드로이드는 코틀린익스텐션의 대체제로 viewBinding을 제공하고 있다.
기본적으로 안드로이드 뷰바인딩은, 빌드 도구에 통합되어 있기 때문에 별도에 플로그인을 추가할 필요가 없다
하지만, 뷰 바인딩이 비활성화 되어 있으므로, 이를 사용하려면 앱 모듈 빌드스크립트(app/build.gradle)에서 이를 활성화 해야합니다.

dataBinding > viewBinding ( 포함 개념이라, gradle 설정 시 주의)
바인딩 클래스 파일은 모듈 내 build/generated/data_binding_base_class_source_out 디렉토리에 생성됩니다.

-> viewBinding 동작 원리는 gradle에 설정하는 것만으로도 개발자가 작성한 레이아웃 파일들을 모두 바인딩 클래스로 자동변환되어 생성된다. . < 자동변환 공식: 레이아웃파일명(첫 글자와 언더바 다음영문을 대문자로 변환) +Binding

-> 액티비티에서
lazy를 사용해서 최초 호출 시에 초기화 되도록 binding 프로퍼티를 선언하고 사용하면 됨.
주의할 점은 setContextView에 binding.root를 전달해야지만 정상 동작 한다.

-> 프래그먼트에서
LayoutInflater를 onCreateView에서 넘겨 받기 때문에 lateinit으로 선언해 두는 것이 편합니다.
주의할 점은 바인딩의 infate() 메스드에 세 개의 파라미터가 사용됩니다, 바인딩.inflate(인플레이터, 컨테이너, false) 형태로 사용됨.
프래그먼트에서 사용하는 레이아웃 이름이 fragment_list.xml 이기 때문에 바인딩은 FragmentListBinding이 됩니다. 만약 레이아웃 파일이름이 다르다면 그에 맞게 바꿔서 사용하면 됩니다.

-> 어댑터에서
주로 리사이클러뷰 어댑터에서 많이 사용하는데, 홀더가 뷰를 생성자로 사용하던 것을 바인딩으로 바꿔주면 된다. 어댑터의 onCreateViewHolder() 에서 바인딩을 생성한 후 Holder에 넘겨주는 패턴은 기존과 동일

뷰 바인딩과 findViewById는 무엇이 다른가요?

사실, findViewById() 를 사용해도 액티비티 혹은 프래그먼트 내 뷰를 참조할 수 있습니다. 하지만 뷰 바인딩은 findViewById() 대비 다음과 같은 장점이 있다.

  1. 널 안전(Null Safety) : 바인딩 클래스에서 제공하는 필드는 각 뷰를 직접 참조하게 구성되어 있습니다. 따라서, 잘못된 ID를 대입하여 널 포인터 오류가 발생하는 등의 문제가 일어나지 않습니다.또한, 특정 구성(configuration)에서만 접근할 수 있는 뷰가 있는 경우, 이는 @Nullable로 표시되므로 뷰 참조시 실수를 방지할 수 있습니다.

  2. 타입 안정성(Type safecy) : 바인딩 클래스 내 필드는 레이아웃 내 선언된 뷰의 타입을 갖습니다. 따라서, 잘못된 타입으로 캐스팅( 예 : ImageView 를 TextView 로 캐스팅) 하는 실수를 우너천 봉쇄할 수 있습니다.


LayoutInflater :

setContentView() 메소드는 액티비티의 화면 전체를 설정하는 역할을 수행하여, 부분 레이아웃을 메모리에 객체화할 수는 없다.
이럴 때는 인플레이터를 사용 해야한다.
일부 화면을 분리한 부분 화면은 LayoutInflater 객체를 사용해 뷰그룹 객체로 객체화(인플레이션)한 후, 메인 레이아웃에 추가하면 된다.

-> LayoutInflater 객체의 inflate() 메소드는
첫 번째 파라미터로 xml 레이아웃 리소스를, 두 번째 파라미터로 부모 컨테이너를 지정한다. View inflate(int resource, ViewGroup root)

-> LayoutInflater 생성하는 3가지 방법
1. val inflater : LayoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE)
context 에서 LayoutInflater 를 가져온다.

  1. val inflater : LayoutInflater = getLayoutInflater()
    activity 에서 LayoutInflater 를 얻어온다. (Activity는 자신의 window의 LayoutInflater를 사용)

  2. val inflater : LayoutInflater = LayoutInflater.from(context)
    LayoutInflater 에 static 으로 정의되어 있는 LayoutInflater.from()을 이용해 LayoutInflater 를 만든다.
    내부적으로 context에서 LayoutInflater 를 가져온다 ( 위에있는 것처럼)

주의사항

  1. inflate() 메서드로 layout을 inflate 한 경우, 해당 xml 의 land, port layout 을 자동으로 참조하게 된다.
  2. inflate() 된 view 의 child view 는 inflate 된 view.findViewById 로 찾아야한다.
  3. inflate() 된 view 의 latyoutParams 속성은 실제 layout 에서 match_parent 라도, wrap_content 로 강제로 변경된다. (inflate 된 view는 parent 가 없어지기 때문에 강제로 wrap_content 시킨다)
  4. inflate() 된 뷰에서 다시 layout inflater를 사용할 경우, 기존의 findViewById와 event 설정들이 모두 사라진다.

ListView :

* 스크롤 가능한 항목을 나타낼 때, 사용되는 뷰 그룹이다.
ListView에서 먼저 View 를 배치한 다음에, 데이터가 저장된 곳에서 데이터를 View의 형식에 맞게 변환하여 가져온다.

안드로이드 리스트 뷰를 사용하기 위해선,

1. 데이터 클래스 정의
Data Class 파일을 만들어 List 목록을 만들 데이터를 실제 변수를 초기화 한 후,
MainActivity에 빈 List를 추가해준다.

2. 레이아웃에 LIstView추가

_3. item 생성
ListView 안에 항목 하나하나를 담당할 item을 만든다. 여기서 xml 레이아웃파일을 커스텀해서 만든다.

_4. 어댑터 생성

Adapter에서 각 메소드가 담당하는 기능은 아래와 같다.
getView(Int, View ViewGroup) : xml 파일의 View와 데이터를 연결하는 핵심 역할을 하는 메소드이다.
getItem(Int) : 해당 위치의 item을 메소드이다. Int 형식으로 된 position을 파라미터로 갖는다. 예를 들어 1번째 Dog item을 선택하고 싶으면 코드에서 getItem(0)과 같이 쓸 수 있을 것이다.
getItemId(Int) : 해당 위치의 item id를 반환하는 메소드이다. 이 예제에서는 실질적으로 id가 필요하지 않아서 0을 반환하도록 설정했다.
getCount() : ListView에 속한 item의 전체 수를 반환한다.

_5. 어댑터 설정 : MainActivity.kr 로 와서 Adapter를 초기화해야한다. 그 후, ListView와 Adapter 를 연결한다.

_6. 그 후, List에 데이터를 집어 넣으면 된다.

주의사항 및 단점

ListView는 Adpater를 통해 getView 메소드를 호출하여 View를 만든다.
최초로 화면을 로딩한 후에도 스크롤을 움직이는 등 액션을 취하면 그 때마다, findViewById를 통해 convertView 에 들어갈 요소를 찾는다. 스크롤 할 때마다 View를 찾으면 리소스를 많이 사용하게 되고, 속도가 느려진다.

따라서 , 스크롤링 할때 조금 더 자연스러운 뷰를 보여주고 싶다면 View Holder를 사용하거나, 그 View Holder를 사용하도록 설계된 RecyclerView가 권장된다. 자세한 내용은 다른 포스트에 별도로 작성해 두었다.

 
profile
40대에 은퇴해, 제주살이를 꿈꾸는 Fire족

0개의 댓글