증상 안드로이드에서 웹뷰를 호출했더니.... All WebView methods must be called on the same thread. .... 네.. 흔한 크로스 쓰래드 에러입니다. 해결 방법 닷넷(.NET)으로 치자면 인보크 해서 처리하는 것과 같이 안드로이드 webview에는 '.post()'가 있습니다. 여기에 'Runnable'을 구현하여 전달하면 됩니다. webviewName.post(new Runnable() { @Override public void run() { //동작 } }); 마무리 이런 오류는 생각보다 자주 만나게 됩니다. 문제는 크로스 스레드는 돌리기 전에는 인지 못 하는 경우가 많아서 말이죠 ㅋㅋㅋㅋㅋㅋ
원래 'adb shell'명령은 보통 컴퓨터에 디바이스를 연결해서 사용합니다. 그런데 가끔 앱 안에서도 'adb shell'명령으로 처리해야 편한 경우가 있습니다. 1. 간단하게 사용하기 그런 경우 'Runtime.getRuntime().exec([명령])'같이 사용할 수 있습니다. 예> Runtime.getRuntime().exec("adb shell"); 이런 식으로 명령을 실행하면 됩니다. 1-1. 여러 명령 한 번에 실행하기 여러 명령을 한 번에 실행하려면 'Runtime.getRuntime().exec([명령])'을 여러 번 호출하시면 됩니다. 예> //adb shell을 마운트 했다가 풀어 준다. Runtime.getRuntime().exec( "adb shell" ); Runtime.getR..
간만에 테스트할게 있어서 adb를 열었더니..... more than one device and emulator 1. 에러 원인 이 에러 메시지는 디바이스가 여러 개 연결되어 있을 때 볼 수 있는 에러입니다. 2. 해결 방법 이 문제를 해결하려면 사용할 디바이스(device)를 지정해 주어야 합니다. 아래 명령어로 디바이스 리스트를 확인하고, adb device 아래 명령어로 디바이스를 지정합니다. adb -s [디바이스 이름] shell 마무리 이런 문제는 원인만 알면 해결은 금방이죠!
안드로이드에서 동적 컨트롤을 추가할 때는 'addView'를 이용합니다. View.addView([추가할 뷰]); View.addView([추가할 뷰], [위치 인덱스]); 버튼을 추가하려면 이런 식으로 하면 됩니다. Button btnTemp; ViewGroup.LayoutParams params; Button btnTemp = new Button(this); btnTemp.setText("Button 2"); ViewGroup.LayoutParams params = new ViewGroup.LayoutParams(600, 300); btnTemp.setLayoutParams(params); this.m_flContainer.addView(btnTemp, 1); 여기서 조심해야 할 것은 추가하려는 뷰에..
안드로이드의 웹뷰에서 Url이벤트를 사용하려면 웹뷰클라이언트(WebViewClient)를 상속받아 오버라이(Override)하여 사용해야 합니다. 웹뷰클라이언트(WebViewClient) 상속받기 일반적인 방법으로 상속받으면 됩니다. 'claWebClient'클래스를 생성하여 웹뷰클라이언트를 상속받아 봅시다. public class claWebClient extends WebViewClient { private Context m_context; //여기서는 토스트 메시지를 사용하기 위하여 컨텍스트를 매개변수로 받습니다. public claWebClient(Context context) { super(); this.m_context = context; } } 메서드 오버라이드(Override)하기 사용 가..
가끔 안드로이드 프로젝트를 하다 보면 타켓 API를 바꿔야 할 때가 있습니다. 사실 이럴 때는 프로젝트를 다시 생성하는 편이 좋습니다 ㅡ,.ㅡ;;; 하지만! 코드를 수정해서 타켓을 바꿀 수도 있긴 합니다. Grable Scripts > build.gradle (Module: app) 를 엽니다. 아래와 같은 코드가 나오는데 여기서 minSdkVersion : 최소 SDK 버전 targetSdkVersion : 타겟 SDK 버전 을 설정 할 수 있습니다.
1. 문제 발견 안드로이드에서 '.sleep'나 'wait'와 같은 스래드를 대기시키는 메소드를 사용하면 발생하는 에러입니다. Error:(116, 25) error: unreported exception InterruptedException; must be caught or declared to be thrown 2. 해결 방법 예외처리 해주라는 소리인 거 같네요. try { Thread.sleep(100L); } catch(InterruptedException ex) { //인터럽트 플래그 재설정 Thread.currentThread().interrupt(); } 이렇게 해도 되고 일반적인 예외처리 방식인 'Exception'을 사용해도 됩니다. try { Thread.sleep(100L); } ca..
1. 기본값 안드로이드 스튜디오는 기본값이 '현재 창에 프로젝트 열기(Open project in the same window)'입니다. 새 프로젝트를 만들거나 열었을 때 다른 창에서 열리게 옵션을 설정해 봅시다. 2. 설정 File > Settings 으로 들어가서 Appearance & Behavior > System Settings > Project Opening 에 들어가면 다음과 같은 옵션이 보입니다. Open project in new window : 프로젝트를 새 창에서 열기 Open project in the same window : 같은 창에서 프로젝트 열기 Confirm window to open project in : 프로젝트 열고 확인하기 여기서 'Open project in new..
안드로이드 스튜디오에서 에뮬로 실행하면 가끔 이런 오류를 볼 수 있습니다. pkg: /data/local/tmp/패키지 내임 Failure : [INSTALL_FALED_UPDATE_INCOMPATIBLE] 이 에러가 나는 가장 흔한 이유는 이전에 테스트하던 프로그램이 지워지지 않았기 때문입니다. 보통은 IDE에서 자동으로 프로그램을 지우거나 덮어 씌우는 과정을 거치게 되는데 이럴때 나는 에러입니다. 디바이스에서 직접 프로그램을 지운 후 다시 시도하면 해결 됩니다.
롤리팝에서 메뉴버튼이 사라져서 인터페이스에 메뉴버튼을 넣었습니다. 숨겨진 메뉴를 사용하기 위해서는 'openOptionsMenu()'를 호출하면 됩니다. 그런데 안뜰 때가 있네? 1. 일반적인 방법 프로젝트를 생성하고 메인엑티비티를 'Blank Activity'로 생성합니다. 버튼을 하나 생성하고 다음 코드를 버튼에 연결합니다. 그러고 나서 실행해보면.... 반응이 없습니다! 보통은 잘되는데 안될 때가 있습니다. 2. 해결방법 이제 'onCreate()'안에 을 다음과 같이 작성합니다. protected void onCreate(Bundle savedInstanceState) { //타이틀바 숨기기 requestWindowFeature(Window.FEATURE_NO_TITLE); super.onCrea..