일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 |
- 소프시스 밤부 좌식 엑슬 테이블
- 안드로이드
- 프래그먼트
- 한달브런치북만들기
- 테트리스
- 목적 중심 리더십
- 리얼하다
- 한달어스
- 1일1커밋
- 면접
- 북한살둘레길
- 자취필수템
- 한달독서
- 커스텀린트
- 슬기로운 온라인 게임
- 함수형 프로그래밍
- 지지않는다는말
- 한단어의힘
- 아비투스
- 브런치작가되기
- 캐치마인드
- 좌식테이블
- 어떻게 나답게 살 것인가
- 베드테이블
- T자형인재
- 소프시스
- 목적중심리더십
- 재택근무
- 끝말잇기
- 베드트레이
- Today
- Total
목록안드로이드 (164)
정상에서 IT를 외치다
안녕하세요 블랙진입니다. 안드로이드 업데이트를 하고 나서 간혹 아래와 같은 에러가 발생하는 경우가 있습니다. > Installation did not succeed. The application could not be installed. 위 에러는 USB를 통해 앱을 연결해서 빌드하는데 계속 끊기는 현상입니다. 아래와 같은 이미지를 보여주면서 우리를 좌절시킵니다. ㅠㅜ 위와 같은 에러가 발생했을 때 디버그 설정을 한 번 확인해 주세요. Use libusb backend 가 체크되어 있는 경우 이를 해지하면 위 에러가 해결될 수 있습니다.
abstract class OnSingleClickListener( private val clickDelayMilliSecond: Long = CLICK_DELAY_TIME ) : View.OnClickListener { companion object { private const val CLICK_DELAY_TIME = 1000L } private var lastClickTime = 0L protected abstract fun onSingleClick(view: View) override fun onClick(view: View) { val now = System.currentTimeMillis() if (now - lastClickTime > clickDelayMilliSecond) { onSingl..
inline fun ifNotNull(a: A?, b: B?, code: (A, B) -> R) { if (a != null && b != null) { code(a, b) } } 다중 null check 할 수 있는 kotlin extension 함수 사용예 val temp1: String? = null val temp2: String? = null ifNotNull(temp1, temp2) { a,b -> //.. a,b는 null이 아니다 }
안녕하세요. 블랙진입니다. 우리는 프래그먼트를 인자와 함께 생성할 때 newInstance()를 사용하곤 합니다. 왜 그럴까요? 흔히 알고 있는 두가지 이유가 있을 겁니다. 1. 프래그먼트 재생성(화면 회전과 같은)시 빈생성자가 있어야 한다.2. 재생성시 받아온 데이터를 유지하기 위해서 사용한다. 우리가 자주 사용하는 코드companion object { private const val ARG_PARAM1 = "param1" private const val ARG_PARAM2 = "param2" @JvmStatic fun newInstance(param1: String, param2: String) = MainFragment().apply { arguments = Bundle().apply { putSt..
안녕하세요. 블랙진입니다. 프로가드에 사용하는 함수의 구체적인 역활에 대한 포스팅 입니다. 프로가드 설정하기프로가드 설정하기2릴리즈 버전으로 컴파일 하기 출처 : Proguard manual ProGuard(프로가드) Shrinker(수축), Optimizer(최적화), Obfuscator(난독화) 적용하기 위한 Java Class File 입니다. Shrinker classes, fields, methods, attributes 찾아 사용하지 않은 것은 제거합니다. Optimization 메소드의 바이트코드를 분석하고 최적화 합니다. Obfuscation classes, fields, methods 의 이름을 재정의 합니다. 키워드 키워드 사진 및 내용 출처 - no rule Proguard를 설정하면..
안녕하세요. 블랙진입니다. 이번에는 binds와 multi binding에 대해 알아보는 시간을 가지겠습니다. 그전에! @Provides와 @Named 어노테이션을 사용해 다형화된 객체를 어떻게 불러오는지 혹은 같은 타입을 반환하는 함수를 어떻게 구분하는지 확인해 보겠습니다. @Provides @Named 사용법 1. CoffeeBean을 추상화 하여 BlackBean과 WhiteBean을 각각 만들어 줍니다. CoffeeBeanpublic interface CoffeeBean { String name(); } BlackBeanpublic class BlackBean implements CoffeeBean { @Override public String name() { return "BlackBin"; }..
안녕하세요. 블랙진입니다. 이번 포스팅에서는 모듈을 초기화 하는 방법에 대해 살펴보겠습니다. 지난 카페예제에서 카페를 생성할 때 아래와 같은 방법으로 생성했습니다. @Module public class CafeModule { @Singleton @Provides CafeInfo provideCafeInfo() { return new CafeInfo("BlackJin"); } //... } "BlackJin" 이라는 이름의 카페를 고정해서 만들었는데 카페 이름을 대거를 선언할 때 초기화 할 수 있게 수정해 보겠습니다. 1. CafeComponent 수정 빌터 패턴 형식으로 Component 생성시 모듈을 선택하여 넣을 수 있습니다. @Singleton @Component(modules = CafeModul..
안녕하세요. 블랙진입니다. 카메라 예제와 함께 보는 Scoped Storage 포스팅 중 드디어 마지막인 안드로이드 Q 대응하기 입니다! 권한 가져오기저장소의 종류이미지 가져오기안드로이드 Q 대응 먼저 targetSdkVersion을 29로 올렸을 때 저장소 경로를 가져오는 코드의 변화부터 살펴보겠습니다. 앞선 저장소 예제에서 설명했듯이 아래는 공용 저장소를 가져오는 코드 입니다.Timber.e("--외부 저장소--") //경로 storage/emulated/0 Timber.d("getExternalStorageDirectory1 : ${Environment.getExternalStorageDirectory()}") //경로 storage/emulated/0/Pictures Timber.d( "getEx..
안녕하세요. 블랙진입니다. 지난 저장소 관련 포스팅에 이어 기존 저장소 방식에서는 어떻게 이미지를 가져오고 사용하는지 살펴보겠습니다. 권한 가져오기저장소의 종류이미지 가져오기안드로이드 Q 대응 갤러리에서 사진 가져오기 갤러리에서 사진을 가져올 때는 아무 권한도 필요 없습니다. 그저 Intent.ACTION_PICK를 통해 Media에 접근할 수 있습니다. val intent = Intent( Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI ) startActivityForResult(intent, PICK_FROM_ALBUM) 혹은 Intent.EXTRA_ALLOW_MULTIPLE 을 사용해 어떤 앨범앱을 사용할지 선택할 수 있습니다.v..
안녕하세요. 블랙진입니다. ViewPager2에서 사용할 수 있는 초 간단한 CustomBottomNavView 예제 코드입니다. 0. CustomView 생성 - @JvmOverloads 를 추가하면 코틀린 컴파일러가 자동으로 오버로딩한 자바 메소드를 추가 해준다.- xml 상에서 자식 뷰를 생성했을 때 자식 뷰 만큼 네비게이션이 만들어 집니다.- 자식뷰에서 설정한 style의 isSelected 여부에 따라 네비게이션의 뷰가 변경됩니다. class BottomNavView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : LinearLayout(context, attrs, ..