분류 전체보기84 java.lang.ClassCastException ClassCastException은 형변환(캐스팅)을 잘못했을때 발생하는 Exception입니다. 다른 Exception과는 다르게 해당 Exception이 발생할 경우의 LogCat을 보면 어떤 코드의 몇번째 라인에서 발생하였는지를 알려주지는 않지만 아래의 예와 같이 어떤 형변환이 잘못되었는지를 알려주게 됩니다. java.lang.ClassCastException: android.widget.LinearLayout$LayoutParams cannot be cast to android.widget.FrameLayout$LayoutParams 해당 예는 LayoutParams를 잘못 적용했을때 발생한 Exception 입니다. 보통은 아래와 같이 잘못된 캐스팅을 하였을 경우에 발생합니다. Object ob.. 2020. 4. 4. LayoutParams의 사용시 주의점, Dp를 Px로 변환하기 1. LayoutParams 사용시 주의점 2. Dp를 Px로 변환하기 1. LayoutParams 사용시 주의점 이전에 Layout의 속성을 xml이 아닌 code상에서 조절하는 방법에 대해서 짧게 글을 쓴 적이 있습니다. LayoutParam의 사용방법에 대해서 약간 더 내용을 추가하고자 합니다. xml의 속성이 다음과 같은 Layout을 가정해 봅시다. 해당 레이아웃에서 LinearLayout의 height를 Code상에서 56dp에서 48dp로 조절하기 위해서는 아래와 같은 방법을 이용하여야 합니다. LinearLayout mLinearLayout = findViewById(R.id.linear1); RelativeLayout.LayoutParams params = new RelativeLayou.. 2020. 4. 3. Layout의 위치를 xml이 아닌 Code를 통해 조절하기 안드로이드 어플리케이션에서 눈으로 보이는 부분과 실제 기능을 구현하는 부분은 구분되어 있습니다. 앱을 실행하면 Hello world 라는 TextView가 뜨는 간단한 MainActivity 하나로만 구성된 앱이 있다면 보이는 앱의 화면은 MainActivity.xml로 디자인하고, 구현되는 코드부분은 MainActivity.java(코틀린이라면 .kt)로 구현합니다. xml 레이아웃 파일에는 버튼이나 텍스트뷰의 위치, @+id로 부여하는 각 요소들의 id와 같은 속성이 여기에 다 있습니다. 앱을 개발할 때 앱의 특정 기능 실행에 따라 버튼의 위치를 변경한다던지 유기적인 레이아웃을 구성해야 할 때가 있습니다. 레이아웃의 위치를 xml 파일에 설정한 것과 다르게 코드를 통해서 바꾸고 싶다면 아래의 Layo.. 2020. 4. 1. invalid drawable tag vector vector 방식의 drawable resource를 사용할 때, 특정 기기에서 다음과 같은 크래쉬 리포트가 발생하는 경우가 있습니다. Caused by org.xmlpull.v1.XmlPullParserException Binary XML file line #1: invalid drawable tag vector 해당 Exception의 해결방법은 아래와 같습니다. 1. app단위의 build.gradle의 defaultConfig에 vectorDrawables.useSupportLibrary = true 추가. defaultConfig { applicationId "com.something.some" minSdkVersion 19 targetSdkVersion 28 versionCode 1 versi.. 2020. 3. 20. android.os.NetworkOnMainThreadException 안드로이드는 메인쓰레드에서 UI에 관한 처리를 하고 있습니다. 즉, 앱이 유저와 상호작용하는 모든 행동이 메인쓰레드를 통해서 이루어집니다. 버튼을 누르면 어떠한 정보를 네트워크로 동기화 하여 리사이클러뷰로 정리한 뒤 보여주는 앱이 있다고 가정해보면, 버튼을 누르고 > 네트워크로 정보를 다운로드 받고 > 리사이클러뷰에 다시 업데이트 하는 상기의 과정을 모두 메인 쓰레드에서 수행하게 된다면 버튼을 누르는 순간부터 작업이 완료될 때 까지마냥 기다려야 합니다. 그 시간동안 어떠한것도 할 수 없이 기다리게 된다면, 사용자에게는 최악의 경험이 된다고 할 수 있습니다. 따라서, 안드로이드 OS의 최우선 목표는, 앱 내부에서 이루어지는 모든 작업이 유저를 방해하지 않도록 하는것이며 따라서 시간이 오래 걸리는 작업은 메.. 2020. 3. 13. AsyncTask, Coroutine, RxJava를 이용한 비동기의 구현 비동기를 구현하는 이유 AsynkTask RxJava Coroutine 안드로이드의 어플리케이션은 UI 쓰레드 라고 하는 메인쓰레드가 UI(각종 버튼, 리스트등)를 관리하고 처리합니다. 이 메인쓰레드는 유저의 앱 사용성에 직결된 요소이기 때문에 항상 막힘없이 처리되어야 합니다. 이 때문에, 메인쓰레드를 통해서 할 수 있는 작업에는 안드로이드 OS가 제약을 두고 있습니다. 간단한 예를 들면, 네트워크를 사용하여 정보를 받아 이를 업데이트 하는 작업이 있다고 가정하고, 이를 메인쓰레드에서 수행하려고 하면 NetworkOnMainThreadException을 뿜어내며 앱이 종료되는것을 확인할 수 있습니다. 때문에 비동기를 구현해서 네트워크작업을 처리해주어야 하고, 이를 위한 여러가지 방법들이 존재하는데, 이때.. 2020. 3. 12. textView를 하이퍼 링크로 만들기 autoLink textview를 하이퍼 링크처럼 보이게 + onClickListener 1. autoLink TextView의 텍스트를 클릭하면 웹브라우저가 열리도록 할 수 있습니다. onClickListner를 달아 세부적인 기능 추가를 할 수도 있으나 간단하게 열릴 수 있도록 하는 옵션은 하단의 autoLink 옵션을 달아주는것으로 충분합니다. android:autoLink="web" 사용방법은 아래와 같습니다. 이외에도 다양한 옵션 부여가 가능합니다. 안드로이드 개발자문서에 따르면 아래와 같습니다. *all로 해두면 자동으로 판단하여 해당 종류에 해당하는 앱을 실행하여 줍니다. all Match all patterns (equivalent to web|email|phone|map). email M.. 2020. 3. 10. 리다이렉트되는 페이지를 Jsoup로 파싱하기 Jsoup는 특정 페이지를 파싱할때 편리하게 사용되는 라이브러리 입니다. 네트워크 작업이기 때문에 메인쓰레드에서 사용할 수는 없고 AsynkTask나 RxJava, Coroutine등을 이용해서 비동기를 구현해 주어야 합니다. 일반적인 사용방법은 아래와 같습니다 public static class GetTITLE extends android.os.AsyncTask { String title; @Override public void onPreExecute() { super.onPreExecute(); progressBar.setVisibility(View.VISIBLE); } @Override public String doInBackground(Void... params) { try { Document d.. 2020. 3. 10. windowSoftInputMode : 키보드 입력 시의 화면조절 옵션 안드로이드의 EditText등에 포커스가 갈 경우 소프트 키보드가 올라옵니다. 이때, 사용자가 화면 구성요소와 작용하는데 키보드가 방해되지 않도록 화면의 레이아웃이 키보드에 맞게 자동으로 조절되게 됩니다. 하지만, 일부 화면의 경우에는 레이아웃이 변하지 않도록 할 경우가 필요한데, 이때에는 manifest의 activity에 windowSoftInputMode속성을 부여하여야 합니다. ..... ..... 위와 같이 android:windowSoftInputMode="adjustPan"속성을 activity에 지정해 주면 소프트 키보드가 올라올 경우에도 화면의 레이아웃이 조절되지 않습니다. 좀 더 자세한 내용은 구글 개발자 문서의 windowSoftInputMode에 관한 부분을 참고 하시면 됩니다. 2020. 2. 11. TabLayout이 태블릿에서 작게 나타날때 TabLayout을 사용할 때 태블릿과 같이 큰 화면에서는 아래의 그림과 같이 TabItem이 화면에 꽉차지 않는 경우가 있습니다. 원인은 Widget.Design.TabLayout내부의 xml 설정때문입니다. 자세한 내용은 stackOverflow를 참고 해 주세요. 이때는 아래와 같이 TabLayout의 XML 설정을 간단하게 변경해주면 TabItem이 화면에 꽉차도록 배열됩니다. TabLayout의 XML 속성에 아래와 같이 tabGravity 속성을 간단히 추가해주면 잘 적용되는것을 볼 수 있습니다. app:tabMaxWidth="0dp" app:tabGravity="fill" 2020. 2. 1. 이전 1 ··· 3 4 5 6 7 8 9 다음