Android Studio에서 Swipe View 만들기

2013년에 작성하였던 Android Swipe View 생성하는 글을 Android Studio에서 하는 방법으로 다시 정리하였습니다.

Android 3.0부터 제공하는 Swipe Views와 Tabs + Swipe를 간단하게 생성하고 적용할 수 있습니다. 그 외 Android에서 제공하는 최신 UI도 간단하게 새로운 프로젝트를 생성함으로써 적용이 가능해졌습니다.

오늘 작성할 Swipe View는 탭을 포함하고, Fragment로 좌우로 이동하는 뷰를 가지고 있습니다.

생성하면 아래와 같은 결과를 기본으로 확인할 수 있습니다.

Read More

Android MVVM 어떻게 구현하는게 좋을까?

MVVM은 Model View ViewModel의 약자입니다.

구글에서는 MVP를 메인으로 정의하는 Architecture를 소개하고, Support library에서는 이를 사용 중입니다.

그리고 iOS에서는 MVVM을 많이 다루고 있습니다.

이러한 Architecture

  • View/Model 간의 코드 분리
  • 테스트 가능한 코드 작성

Read More

Kotlin constructor init 이란?

kotlin의 constructor 정리해보려고 합니다.

우선 일반적인 java에서의 생성자는 아래와 같이 className(매개 변수) 형태로 정의 가능합니다.

생성자를 여러 개 두더라도 Overloading을 이용하여 이를 해결할 수 있습니다.

public class Sample {

	private String name;
	private int age;
	private String birthday;

	public Sample(String name) {
		this.name = name;
	}

	public Sample(String name, int age) {
		this(name);
		this.age = age;
	}

	public Sample(String name, int age, String birthday) {
		this(name, age);
		this.birthday = birthday;
	}
}

Read More

Android 윈도우(Overlay) 권한 사용시 예외 사항

Android 6.0인 Marshmallow부터는 SYSTEM_ALERT_WINDOW을 사용하는 경우 권한 획득이 필수가 되었습니다.

다만 Play 스토어 정책에 따라서 조금씩 다를 순 있습니다.

  • Play 스토어에서 설치하는 경우 Overlay가 true로 자동 활성화 처리됩니다.(2017. 03)

하지만 Android 6.0(Marshmallow)와 7.0(Nougat)에서 서로 다른 접근 방법을 가지고 있습니다.

개발하실 때 그리고 사용자가 사용할 때 주의해야 할 버전이 6.0입니다.

그래서 6.0(Marshmallow)에서 발생하는 예외 사항을 정리하는데 이 예외사항은 권한과 관련한 큰 문제입니다.

Read More

ButterKnife/findViewById 대신 Kotlin android extensions 사용하기

Kotlin에서는 ButterKnife와 findViewById을 사용하지 않아도 됩니다.

Kotlin에서는 간단하게 kotlin Extensions을 사용할 수 있습니다.

우선 적용하지 않고 일반적인 코드는 아래와 같습니다.

findViewById를 매번 해야 하고, 귀찮습니다.

적용하는 방법도 여러 가지가 있을 수 있습니다.

class ImageFragment : Fragment(), ImageContract.View {

    private val rootContainer by lazy {
        activity.findViewById(R.id.root_container) as CoordinatorLayout
    }

    override fun onViewCreated(view: View?, savedInstanceState: Bundle?) {
        // 또는 아래와 같이
        val rootContainer = activity.findViewById(R.id.root_container) as CoordinatorLayout
    }
}

Read More