728x90 전체 글520 안드로이드 권한 다시 뭍지 않음 일때 private fun requestAddressPermission(trigger: PublishSubject){ val permissionListener = object : PermissionListener { override fun onPermissionGranted() { // 권한이 허용됨 moveSearchContact(trigger) } @SuppressLint("CheckResult") override fun onPermissionDenied(deniedPermissions: java.util.ArrayList) { // 다시 묻지않음 상태 if (deniedPermissions.contains(Manifest.permission.READ_CONTACTS) && !ActivityCompat.s.. 2024. 3. 22. 안드로이드 EditText 모양 바꾸기 및 선택시 모양 변경 안드로이드에서 EditText 의 모양을 바꾸고 싶을 때가 많습니다. 최근의 안드로이드에서는 EditText의 기본적인 모양이 테마에 의해 일반적으로 언더바 형태이죠. 여기서는 약간 코너에 라운드가 있는 사각형의 모양으로 바꿀겁니다. 또한 선택되었을 때 (포커스가 잡혀 있을때) 사각형의 색상도 바꿔줄 것입니다. (변경전) (변경후) 1. res/drawable 에 xml 파일 하나 추가 res/drawable 에 EditText의 모양을 지정할 적당한 이름의 xml 파일을 추가합니다. 여기서는 edittext_rounded_corner_rectangle.xml 이라고 하겠습니다. 2. 아래의 샘플과 같은 요령으로, 원하는 형태의 EditText 형태를 작성합니다. 3. 모양의 변경을 원하는 EditTex.. 2023. 4. 16. 안드로이드 툴바 (include, databinding) 반복되는 레이아웃 하나의 앱에는 자주 재사용되는 레이아웃이 있는 경우가 많다. 예를 들면, 거의 비슷하게 툴바가 앱 전역에 걸쳐 사용되고 있을 수 있다. 같은 툴바가 FirstActivity와 SecondActivity에 사용되는 경우를 살펴보자. 각 액티비티의 레이아웃은 이런 식으로 생성될 것이다. 이 예시에서는 화면이 Frist Activity와 Second Activity 두 개밖에 없지만, 같은 타이틀 바가 100여개의 화면에 적용되어야 한다면 어떨까. 모든 화면마다 툴바에 해당하는 이 부분이 추가되어야 할 것이다. 이렇듯 반복되는 레이아웃을 재활용할 수 있도록 만들어진 것이 include 태그이다. 태그 include 태그는 한 번 작성한 레이아웃의 일부를 여기저기에서 가져다 쓸 수 있도록 해 .. 2023. 3. 29. TedPermission 보일러 플레이트 코드 package com.ej.tedpermissiontest import android.Manifest import android.os.Build import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.util.Log import com.gun0912.tedpermission.PermissionBuilder import com.gun0912.tedpermission.PermissionListener import com.gun0912.tedpermission.normal.TedPermission class MainActivity : AppCompatActivity() { override fun onCreat.. 2023. 3. 28. 안드로이드 resConfig resConfig(Build.Gradle) build.gradle 에서 resConfig 빌드 시간을 빠르게 하기 위해 Build.Gradle 에서 resConfig 셋팅 하는 경우가 있다. dev { resConfigs "ko", "xxxhdpi" } 주의 해야 할 점은 ko xxxhdpi 리소스를 제외한 모든 resource를 지우고 빌드 하기 때문에 실행 하고 나서 앱 내에서 언어를 변경 하게 되면 ko 리소스 빼고는 이미 지워진 상태이기 때문에 locale 셋팅을 바꾸더라도 다른언어로 변경 되지 않는다. 이 부분을 인지하고 있지 않은 상태에서 다국어 지원을 할 경우 원인을 찾기 쉽지 않다. 2023. 3. 23. 안드로이드 firebase 연동 그 첫번째는 firebase를 연동하는 것이다. 공식문서와 함께 작업해보자. 우리는 옵션1로 시작할 것이다. 1. 새 android project 생성 먼저 프로젝트를 생성해놔야 코드를 넣을 수 있다. empty project를 하나 만들어주자. 롱타임노씨 브로.. 2. firebase 회원가입 및 프로젝트 생성 회원가입은 편하게 구글로 하면 된다. 짓고 싶은 이름으로 하나 만들어준다. google analytics 설정을 안 하면 바로 빌드된다. 3. Android 앱에 Firebase 추가 홈 화면에서 '앱에 Firebase를 추가하여 시작하기 - Android' 로고를 선택 3.1) package 명 입력 최상단 패키지명을 입력하면 된다. 3.2) SHA-1 입력 Android Studio 우측에 .. 2023. 3. 14. viewmodel에서 R.string 처리하기 viewmodel에서 livedata(Int)를 통해 R.string값을 데이터 바인딩 하여 xml에서 context.getString(해당하는 값) 이런식으로 사용하면 된다. ex) viewmodel) val textResource = MutableLivdata(R.string.hello) layout) android:text="@{context.getString(viewModel.textResource)}" 참고 https://leesmemo.tistory.com/21 2023. 3. 10. 안드로이드 Navigation 미리보기 안될 때 code 작성 2023. 2. 7. 안드로이드 title 없애기 windowNoTitle true 설정 2023. 2. 7. 안드로이드 애뮬레이터 에디터 분리 우측 탭 Emulator -> 톱니바퀴 -> View Mode -> Float 2023. 2. 6. 안드로이드 recycler adapter onclick 함수 레퍼런스 메소드로 넒겨준다 private val adapter = ProductCardListAdapter(::onItemClicked, ::onFavoriteIconClicked) private fun onItemClicked(viewState: ProductCardViewState) { findNavController().navigate(ProductListFragmentDirections.actionProductListFragmentToProductDetailsFragment()) } private fun onFavoriteIconClicked(viewState: ProductCardViewState){ viewModel.favoriteIconClicked(viewState.id) } 2023. 2. 6. 안드로이드 viewpager2 안에 scollview 동작안할 때 문제 : Horizontal ViewPager2 내부에 ScrollView(RecyclerView)가 존재할 떄. 예를 들어, ViewPager2의 orientaion: Horizontal ScrollView(RecyclerView) orientation : Horizontal 로 같을 때. 부모 뷰 (ViewPager2)에 포커싱이 되어 자식뷰의 스크롤이 먹히지 않거나 혼선이 생기는 경우가 발생한다. 자식뷰에 터치 이벤트가 발생했을 때 우선적으로 스크롤을 인식할 수 있도록 도와주는 NestedScrollableHost 라는 애가 있다. 구글 Migrate from ViewPager to ViewPager2 가이드에 보면 구글 ViewPager 가이드 중첩 스크롤 가능 요소 지원 ViewPager2는 스.. 2023. 1. 19. 안드로이드 빌드 앱 실행시 동작 안하는 경우 디버그 시, "Could not connect to remote process. Aborting debug session." 라는 에러가 발생하여 디버깅이 진행되지 않는 문제가 있었다. 해결법은 아래와 같다. 1. app > EditConfigurations > Launch Option 하위 Launch 값을 Default Activity 로 변경 app> Edit Configuration Default Activity 로 설정 2. Invalid Cashes and Restart (본인은 1번을 확인했을 때 이미 Default Activity 였으며, 2번을 했을 때 정상 작동하게 되었음) [참고] https://yejinson97gaegul.tistory.com/entry/Android-Could-n.. 2023. 1. 12. springboot 멀티 모듈 프로젝트에서 다른 모듈의 빈을 찾지 못할 때 문제 상황 Spring boot 멀티 모듈 프로젝트에서 다른 모듈의 빈을 찾지 못하는 상황. 두 모듈의 group 이 다름 Ex) A 모듈에서 생성한 a bean을 B 모듈 안에서 주입받고 싶음 A 모듈의 group id: com.example.a B 모듈의 group id: com.example.b 발생 에러 생성자 주입 시 argument를 찾을 수 없다는 에러 발생 원인 및 해결 방법 원인은 두 모듈의 group id가 달라서 그런 것..! (정확히는 패키지가!) 기본적으로는 @SpringBootApplication 애노테이션이 붙은 클래스가 위치하는 곳이 basePackage로 설정되어 해당 패키지 하위 패키지의 컴포넌트를 가져옴 하지만 위 예시처럼 패키지가 다른 경우 별도로 컴포넌트 스캔을 하고.. 2023. 1. 9. 안드로이드 Manifest deeplink 에 data 등록 딥링크로 액티비티 실행 package com.ej.deeplinktest import android.content.Intent import android.net.Uri import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Button class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) var moveButton = findV.. 2023. 1. 9. 안드로이드 Manifest launchmode 앱과 엑티비티의 특성에 맞지 않는 무분별한 launch mode 설정은 사용자들에게 불편함을 주기 때문에 주의해야 합니다. 속성 standard singleTop singleTask singleInstance standard 가장 일반적으로 많이 사용되는 속성이고 default값이다. 기존에 생성된 Task에 엑티비티를 계속 쌓고 버튼을 연속 두번 누를 경우 같은 엑티비티가 2개 이상 쌓일수 있다. ( A > B > A > A ) singleTop 설정된 엑티티가 같은 Task 제일 상단에 존재할 경우 새로운 엑티비티를 생성하지 않고 기존에 생성된 엑티비티를 재 사용하며 onNewIntent 메서드를 호출한다. ( B > C 상태에서 C 호출시 B > C > C 가 아닌 B > C 스텍 유지 ) ※ C .. 2023. 1. 9. Firebase Cloud Message 적용 FCM 테스트 예제 https://github.com/EoJin-Kim/Android-FCM-Test EoJin-Kim/Android-FCM-Test Contribute to EoJin-Kim/Android-FCM-Test development by creating an account on GitHub. github.com 2023. 1. 9. int[] to Integer[] int[] intArray IntStream.of(intArray).boxed().toArray(Integer[]::new); 2023. 1. 2. springboot multimodule ❗️ 멀티 모듈 프로젝트가 필요한 이유 예를 들어서 회원 프로그램을 개발한다고 했을 때 여러 개의 서버가 필요하다. ① batch 서버 ② API 서버 등등 하지만 해당 서버들을 단일 프로젝트로 만들게 되면 다음과 같은 문제가 생긴다. 첫번째, 공통적으로 처리해야하는 코드의 처리 : 아예 분리되어 있는 프로젝트이다 보니 공통되는 코드들은 각 프로젝트에 복붙해서 사용할 수 밖에 없고, 한 파일의 코드가 수정되는 경우 다른 프로젝트의 코드도 수정해줘야 한다. 두번째, 접근성 문제 : 프로젝트 수에 따라 IDE 를 실행시켜야 하고 ,, 프로젝트 수가 많아지면 많아 질 수록 개발하는데 어려움이 동반 될 수 밖에 없다. 이런 문제를 해결하기 위해선 멀티 모듈 프로젝트를 사용하면 된다. ❓ 멀티 모듈 프로젝트의 구.. 2023. 1. 1. 안드로이드 buildSrc를 활용한 dependency 관리 좌측 탭을 Project 뷰로 설정 프로젝트 하단에 buildSrc 폴더 생성 buildSrc 폴더 안에 build.gradle.kts 생성 후 작성한다음 gradle sync 클릭 repositories{ mavenCentral() } plugins{ `kotlin-dsl` } buildSrc안에 디렉토리 생성해서 src\main\java 경로 생성(현재 내가 이미 생성해서 보이지는 않음) Dependency.kt 파일에 모듈 버전 정의 import Versions.DAGGER_VERSION import Versions.HILT_COMPILER_VERSION import Versions.JAVAX_INJECT_VERSION //import Versions.NAV_VERSION object Version.. 2022. 12. 18. 안드로이드 비밀 키 저장방법 1. gradle.properties에 저장 2. app level build.gradle에 선언 3.프로젝트 빌드 후 사용 BuildConfig.[변수 이름] 으로 접근하여 사용 4. .gitignore에 .gradle.properties에 등록하여 깃 등록 배제 2022. 12. 16. 안드로이드 @JvmDefault 에러 @JvmDefault 에러 발생시 app level의 build.gradle 파일에 추가 freeCompilerArgs 추가 2022. 12. 13. 안드로이드 테스트 Mock Web Server response josn 값을 저장할 파일을 resources 폴더를 만들고 하위에 저장(newsresponse.json) setUp()함수에서 mockWebServer생성하고 newAPIService는 일반 apiservice와 같다 package com.ej.android_cleanarchitecture_newsapiclient.data.api import com.google.common.truth.Truth import com.google.common.truth.Truth.assertThat import kotlinx.coroutines.runBlocking import okhttp3.mockwebserver.MockResponse import okhttp3.mockwebserver.MockWebS.. 2022. 12. 13. 안드로이드 livedata 테스트 https://github.com/robolectric/robolectric GitHub - robolectric/robolectric: Android Unit Testing Framework Android Unit Testing Framework. Contribute to robolectric/robolectric development by creating an account on GitHub. github.com androidx 테스트를 하기위해서는 robolectirc 모듈을 사용한다. LiveDataTestUtil.kt https://github.com/android/architecture-components-samples/blob/master/GithubBrowserSample/app/src/t.. 2022. 12. 11. 안드로이드 AndroidTest (room dao test) @RunWith(AndoridJUnit::class) 작성 dependency 추가해야 사용할 수 있음 testImplementation "androidx.test:core:1.5.0" package com.ej.tmdbclient.data.db import android.app.Application import androidx.arch.core.executor.testing.InstantTaskExecutorRule import androidx.room.Room import androidx.test.core.app.ApplicationProvider import androidx.test.ext.junit.runners.AndroidJUnit4 import com.ej.tmdbclient.data.mod.. 2022. 12. 11. 안드로이드 UnitTest Mock InstantTaskExecutorRule을 이용하면 안드로이드 구성요소 관련 작업들을 모두 한 스레드에서 실행되게 한다. 그러므로 모든 작업이 synchronous하게 동작하여 테스팅을 원활하게 할 수 있다. 즉 동기화 때문에 고민할 필요가 없어진다. Mock을 사용하여 Calculations 객체 생성 후 when thenReturn을 사용하여 해당 함수 리턴값 설정 package com.anushka.circlecalc import androidx.arch.core.executor.testing.InstantTaskExecutorRule import com.google.common.truth.Truth import com.google.common.truth.Truth.assertThat import.. 2022. 12. 11. 안드로이드 UnitTest https://truth.dev/ Truth - Fluent assertions for Java and Android What is Truth? Truth is a library for performing assertions in tests: assertThat(notificationText).contains("testuser@google.com"); Truth is owned and maintained by the Guava team. It is used in the majority of the tests in Google’s own codebase. Why use truth.dev junit4 랑 truth를 사용하여 테스트 class MyCalc : Calculations { private val .. 2022. 12. 11. WorkManger Worker 주기적 반복 실행 package com.anushka.workmanagerdemo1 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.lifecycle.Observer import androidx.work.* import kotlinx.android.synthetic.main.activity_main.* import java.util.concurrent.TimeUnit class MainActivity : AppCompatActivity() { companion object{ const val KEY_COUNT_VALUE = "key_count" } override.. 2022. 12. 6. WorkManger Chaining Works WorkManger에서 병렬로 work를 실행할려면 리스트로 work 넣어주면 된고 순차적으로 실행시킬려면 .then()으로 실행 package com.anushka.workmanagerdemo1 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.lifecycle.Observer import androidx.work.* import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { companion object{ const val KEY_.. 2022. 12. 5. WorkManager Worker의 Input, Output data 설정 Data.Builder로 데이터 생성 후 request에 setInputData로 넘겨준다 Woker의 데이터를 it.outputData를 사용하여 받을 수 있다 package com.anushka.workmanagerdemo1 import androidx.appcompat.app.AppCompatActivity import android.os.Bundle import android.widget.Toast import androidx.lifecycle.Observer import androidx.work.* import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { companion obje.. 2022. 12. 5. 이전 1 2 3 4 ··· 18 다음 728x90