socket.io-client를 이용해서 소켓 클라이언트 기능을 구현할때, 네트워크 설정이 정상임에도 connect()가 동작하지 않는 경우가 있다.

또는 직접 만든 백엔드 서버와 통신시 데이터 전송이나 수신이 안되는 경우.

http를 이용하는 경우.

manifest의 application태그 안에 android:usesCleartextTraffic="true"를 추가해주면 된다.


안드로이드 에뮬레이터에서 localhost를 접근하고 싶을 때.

127.0.0.1가 아닌 10.0.0.2로 접근해야한다.


커스텀 위젯을 만들 때 radius가 있는 레이아웃을 원하는 경우, radius라는 xml을 만들어서 background로 적용하게되는데 이때 resources.getDrawable이 deprecated가 되었다.

ContextCompat.getDrawable(context, R.drawable.radius) 를 사용하자

https://developer.android.com/training/custom-views/custom-drawing?hl=ko 

 

맞춤 그리기  |  Android 개발자  |  Android Developers

맞춤 뷰에서 가장 중요한 부분은 디자인입니다. 맞춤 그리기는 애플리케이션의 필요에 따라 쉽거나 복잡할 수 있습니다. 이 과정에서는 가장 일반적인 작업 몇 가지에 관해 설명합니다. 맞춤 뷰

developer.android.com


val rectF = RectF(0f, 0f, cWidth, cHeight)
커스텀 위젯을 구현할 때, width나 height값은 float형으로 주어야 한다.
이때 Int형으로 주어진 값들을 width as Float와 같이 캐스팅을 하려고 하면 런타임에서 에러가 발생한다.

>> java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Float

자바를 잘 사용하지 않아서 이런 기본적인 실수도 하는거 같다 ㅡ.ㅡa

Int클래스의 toFloat()를 이용하자.

만약 에러가 발생한다면 toFloat을 하는 개체가 null이 아니라는 것을 알려주자.

width!!.toFloat()


종종 R.string에 선언한 값을 String으로 쓰고싶을 때가 있다.
R.string.some_string하면 Int값으로 반환되기 때문에 바로 사용할 수 없다.

getString(R.string.some_string)을 사용하자.

만약 커스텀 레이아웃등 일반적인 호출구간이 상황이 아니라면 context.getString을 하면된다.


val paintBackground = Paint()
val rectF = RectF(0f, 0f, cWidth, cHeight)
val grad : Shader= LinearGradient(0f, 0f, cWidth, cHeight/2, 0xFF00FFEB.toInt(),0xFF073ABB.toInt(), Shader.TileMode.CLAMP)
paintBackground.setShader(grad)
canvas?.drawRoundRect(rectF, 25f, 25f, paintBackground)

둥근 박스에 배경색으로 그래디언트를 넣는 코드이다.
이때 계속 미리보기 화면에서 적용이 안되는 현상이 있었는데, color code를 잘못적었었다..

안드로이드의 컬러코드는 0xAARRGGBB로 이루어져 있다. 따라서 0x00ffeb라는 색을 넣고 싶으면 가장 앞에 알파 값을 지정해준 0xff00ffeb로 적어줘야한다.


가끔 layout에서 요소들 chaining이 비활성화되어있어서 설정할 수 없는 경우가 있다.

그럴때는 xml상에서 수동으로 설정해주어야한다.

  • layout_constraintTop_toTopOf
  • layout_constraintTop_toBottomOf
  • layout_constraintBottom_toTopOf
  • layout_constraintBottom_toBottomOf
  • layout_constraintBaseline_toBaselineOf
  • layout_constraintStart_toEndOf
  • layout_constraintStart_toStartOf
  • layout_constraintEnd_toStartOf
  • layout_constraintEnd_toEndOf

A <-> B 이처럼 체인을 구성하고 싶다면, B에 layout_constraintStart_toEndOf를 A로 설정하고 A의 layout_constraintEnd_toStartOf를 B로 설정하면 된다.


onCreate가 끝나기 전 getSystemService를 하게되면 다음과 같은 오류가 발생한다.
( getSystemService(Context.TELEPHONY_SERVICE) )
- system services not available to activities before oncreate() 

이럴 때는 context를 받아와서 해당 context의 getSystemService를 호출하자.

context.getSystemService(Context.TELEPHONY_SERVICE)


InetAddress.getByName()과 같이 네트워크 접속을 하는 함수가 실행될때, Main Thread에서 돌아간다면 다음과 같은 Exception이 발생한다.
- android.os.NetworkOnMainThreadException

Thread또는 Coroutine을 이용해서 Main이 아닌 다른 스레드를 사용하도록 하자.

Coroutine의 경우 Dispatchers.IO를 이용하면 된다.


png와 같은 이미지 파일을 Drawable로 추가하고싶은데, image asset에서 정상적으로 표시되지 않는 경우가 있다.

안드로이드 스튜디오의 왼쪽 편의 Resource Manager를 켜서 +버튼을 클릭한뒤, Import Drawables에서 png파일을 클릭하여 drawable을 만들수 있다. 사용할 때는 @drawable/[png파일명]로 사용할 수 있다.


File.listFiles()가 null을 반환할 때

먼저 manifest에 READ_EXTERNAL_STORAGE권한이 추가되어있는지 확인한다.

그 뒤, 런타임에서 권한을 허용받는지 체크한다.

그래도 null이라면, manifest의 <application 태그에 android:requestLegacyExternalStorage="true"를 추가한다.


activity 가 실행되면서 editText에 focus를 주고 soft keyboard를 띄울때 키보드가 띄워지지 않는 경우

manifest의 activity에 windowSoftInputMode="stateVisible"을 추가한다.

<activity
android:name=".MainActivity"
android:windowSoftInputMode="stateVisible">

reflection을 통해 static method를 실행시키고 싶은 경우.

manifest의 activity에 windowSoftInputMode="stateVisible"을 추가한다.

val c = Class.forName("className")
val method: Method = c.getDeclaredMethod("functionName")
method.invoke(c.newInstance())

인자가 있는 경우 getDeclaredMethod("functionName", args)와 같은 방식으로 작성하고 invoke에 인자를 추가한다.


class PreferenceFragment : PreferenceFragmentCompat() {
    override fun onCreatePreferences(savedInstanceState: Bundle, rootKey: String) {
        setPreferencesFromResource(R.xml.setting_preference, rootKey)
    }
}

PreferenceFragment를 만들 때, setPreferencesFromResource의 인자로 R.xml.[레이아웃 파일명]을 전달해야하는데, R.xml 이후를 탐색하지 못해서  Unresolved reference 에러가 발생했다.

 

이 경우 상단에 import android.R이 있는지 확인한다.
해당 라인을 삭제하고 import [패키지 경로].R로 변경한다. 

ex) com.example.test.R


Failure [INSTALL_FAILED_INVALID_APK]

종종 앱 내에서 다운로드한 apk파일을 설치할때 pm install에서 에러가 발생하는 경우가 있다.
pm install의 결과로는 어떤 부분이 잘못되었는지 파악하기 힘들다.

이런 경우 logcat을 보면 PackageManager에서 출력해주는 에러로그를 보면 된다.

주로 apk파일에 read 권한을 주지 않아서 발생하는 듯 하다.

... 추가예정

 

 

 

복사했습니다!