Stroke color : val drawable = view.background as GradientDrawable drawable.setStroke(3, ContextCompat.getColor(context, R.color.colorWhite)) // width and stroke color Solid color : val drawable = view.background as GradientDrawable drawable.setColor(ContextCompat.getColor(context, R.color.colorWhite)) // solid color resource_border.xml
프로젝트 생성 후 앱 이름을 변경하고 싶다면 어떻게 해야 할까? 먼저 string.xml 파일을 들어가보면 (파일을 쉽게 찾고 싶다면 shift를 두 번 연속 누르고 검색하면 된다.) AppName 위의 app_name 이라는 Resource 가 있을 것이다. 해당 부분을 원하는 이름으로 변경 후 AndroidManifest.xml 로 이동한다. @string/app_name 이 사용된 곳이 두 곳이 보일 것이다. 해당 부분을 변경해 주면 앱 이름이 변경된다.
Android studio 에디터 화면에서 코드를 작성하다 보면 자동으로 줄바꿈이 일어난다. 이 부분 때문에 코드가 자동으로 줄바꿈 되면서 내가 원치 않게 코드 라인이 보여지는 경우가 있다. 이 부분을 수정해 보자. Mac 기준 상단 메뉴 Android Studio Click -> Preferences -> Editer -> Code Style Hard wrap at 부분을 수정해 주면 된다. 처음 기본 값은 아마 100 으로 설정되어 있을 텐데, 자신이 원하는 수치만 큼 조절 하면 라인당 최대 길이 조절이 가능하다. Android Studio Version 3.5.3 참고 : https://stackoverflow.com/questions/30851617/how-to-set-max-line-length..
토이 프로젝트에서 기존 FCM의 Message 전송 방식을 사용하다가, 토큰이 계속해서 누적이 되면서 전체 푸시를 보낼 때, 점점 반응이 느려지기 시작했다. 기존방식은 fcm.send(message) 로 보냈었는데, var message = { data: { message : { type:'100', channel: '100', title: '메시지가 도착했습니다.', content: tempMsg } }, to: "토큰" }; message의 to 또는 registration_ids 를 통해 한번에 여러 기기에 보내는 방식이었다. 하지만 위의 방법은 단점이 있다. 첫 번째 to는 단일 사용자에게 보내는 방식으로 여러 명에게 보내려면 반복문을 돌면서 실행시켜야 하며, 이는 나 같이 적은 리소스를 가지고 ..
걷기 운동은 주말마다 하는데, 글은 오랜만에 작성하는 듯하다. 새해부터는 친구 한 명이 추가로 주말마다 걷기 운동에 동참하여 3명이서 하고 있다. 이번 주에 갔던 코스는 광명!!! 가산디지털 단지에서 출발했는데 생각보다 거리가 가까워서 자체적으로 난이도를 조절해서 산을 올라갔다. 첫 번째 산은 이름 모를 동네 뒷산 같은 곳을 뛰어 올라가서 정상을 찍고 내려왔고, 두 번째 오른 산은 광명 동굴인데 길이 아주 잘 되어 있어서 오르기가 쉬웠?다. 분명 사진에 보이는 곳까지는 금방 올라갔는데, 친구가 너무 쉽다고, 다른 길(개고생 길)을 찾아서 산을 전체적으로 구경할 수 있었다. 광명 동굴에서 내려와 간 곳은 코스트코!! 정말인지 쇼핑을 좋아하는 사람에게는 천국과 같은 곳이었다. 시간 가는 줄 모르고 코스트코를..
UITabBarController를 사용하는데 특정 조건에서 특정 탭이 클릭은 되지만, 페이지가 넘어가지 않고 다른 액션을 실행하고 싶을때가 있다. 이때는 UITabBarControllerDelegate 의 func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool 를 이용해 제어가 가능하다. 먼저 MainTabBarController 클래스를 생성하고 아래와 같이 코드를 작성한다. MainTabBarController.swift import Foundation import UIKit class MainTabBarController: UITabBarCont..
예를 들어 디버그와 릴리즈시 코드상에 분기를 태워 각각 다른 값을 사용할수도 있고, 다른 방법으로 Build.gradle(app) 에서 사용하는 방법도 있다. gradle 에 값을 추가하고 가져오는 방법에는 두가지 정도가 있는데, 한가지는 BuildConfig 에서 가져오는 방법과 res 에서 가져오는 방법이 있다. 선언 방식 android { ... buildTypes { release { // These values are defined only for the release build, which // is typically used for full builds and continuous builds. buildConfigField("String", "BUILD_TIME_01", "\"릴리즈 맞춤형 ..
Android 에서 리시버에 android:process=":remote" 를 추가 하면 별도의 프로세스에서 실행을 하게되는데, onReceive()를 동작 시키면서도 어플리케이션의 메인쓰레드를 멈추지 않게 된다. 따라서 어플리케이션은 종료 해야하는데 서비스는 계속 동작하고 싶게 만들고 싶을때 사용하면 된다. 하지만 문제는 리소스의 사용량 증가와, Singleton 및 static 변수를 별도의 프로세스에서는 접근이 불가능 하게 된다. ex) SharedPreferences 도 공유 사용이 불가능 하다. 게다가 android:process=":remote" 와 동일한 기능 구현은 다른 방법으로도 가능하므로 특별한 경우가 아니면 신중하게 사용해야 한다.
Android suppport Library 28 로 업데이트후에 FloatingActionButton 안의 이미지가 Center를 벗어나서 그려지는 현상이 보였다. 찾아보니 버그라는데, 이것 저것 해보니 해결 방법은 두가지가 있다. 1. FloatingActionButton xml을 layout_width layout_height 56dp 로 설정 (이부분 변경이 필요할시 2번 방법을 쓰면 작동이 되었다.) 2. code 추가 fab.scaleType = ImageView.ScaleType.CENTER
BottomNavigationView 를 사용할때 버튼이 4개 이상 늘어나면 버튼의 이름 들이 선택 할 때만 보이게 된다. 이럴때는 아래의 옵션 xml 에서 BottomNavigationView 에 아래의 옵션을 추가 하여 BottomNavigationView의 이름 보기 방식을 변경할수 있다. app:labelVisibilityMode="labeled" 총 4개의 옵션이 있는데, 하나씩 설명해 보면 1. auto 3 개 이하의 항목이있는 경우 레이블은 "레이블"으로 동작하거나 4 개 이상의 항목이 있으면 "선택된"레이블로 동작합니다. 즉 3개 이하의 메뉴일때는 이름이 그대로 보이고, 그 이상 일때는 선택된 버튼만 이름이 보인다. 2. labeled 모든 항목의 이름이 전부 노출된다. 3. unlabel..