'프로그래밍/안드로이드'에 해당되는 글 24건

  1. 2015.12.16 안드로이드 웹뷰에서 카카오링크 등 인텐트 안될 경우~
  2. 2015.06.30 안드로이드 프래그먼트를 활용한 탭 만들기
  3. 2015.06.17 안드로이드 웹뷰에서 뒤로가기 버튼 처리 - 웹페이지 리다이렉트 경우
  4. 2015.06.08 안드로이드 인트로 화면 만들기
  5. 2015.05.29 안드로이드 스튜디오 버전 설정, 아이콘 생성 그리고 릴리즈 빌드하기
  6. 2015.05.23 이미지로 제공하는 안드로이드 실시간 검색어 앱 추천~
  7. 2015.05.22 안드로이드 JSON 파싱하기
  8. 2015.05.20 안드로이드 네트워크 연결하기 (Network On Main Thread Exception 처리) (1)
  9. 2015.05.06 웹에서 액티비티 호출하기 (1)
  10. 2015.05.04 안드로이드 웹뷰(WebView) 사용하기

안드로이드 웹뷰에서 카카오링크 등 인텐트 안될 경우~

|



안드로이드 웹뷰에 대해서 한번 정리했었는데요.. 

안드로이드 웹뷰(WebView) 사용하기

안드로이드 웹뷰에서 뒤로가기 버튼 처리 - 웹페이지 리다이렉트 경우

웹에서 액티비티 호출하기


웹뷰를 사용하다보면 카카오링크와 같이 인텐트로 외부 앱을 모바일에서 실행하는 경우가 있습니다. 

폰에 내장된 브라우저에서는 잘 되는데, 안드로이드 4.4. SDK부터 Chrominum 기반으로 웹뷰가 변경되면서 웹뷰에서 인텐트를 지원하지 않는 이슈가 있습니다. 



인텐트를 지원하도록 WebViewClient를 상속한 함수에서 shouldOverrideUrlLoading 메소드를 다음과 같이 수정하면 됩니다. 







Trackback 0 And Comment 0

안드로이드 프래그먼트를 활용한 탭 만들기

|



모바일에서 많이 사용하는 탭 스타일을 구성할 때, 안드로이드 5.0이후 Material Tab Design을 추천하고 있다. 

안드로이드에서 Material Design은 직관적이면서 일관된 UI/UX를 제공하는 것을 말한다. 

다시 말해 UI/UX의 일관성을 위해 구글이 제시한 가이드가 바로 Material Design이다. 


탭 UI/UX와 관련된 샘플을 살펴보니 프래그먼트를 활용하여 탭 사이를 빠르게 이동하고, 좌우로 스와이프(Swipe)하는 기능을 제공하고 있다. 

안드로이도 예제인 SlidingTabsBasicSlidingTabsColors를 다운 받아서 살펴보면 이해할 수 있을 것이다.


안드로이드 탭 스타일

SlidingTabsBasic을 기반으로 안드로이드 탭 구성을 살펴보도록 하자. 

기본적으로 SlidingTabLayout.java 파일과 SlidingTabStrip.java 파일을 활용해야 한다. 

SlidingTabLayout.java

SlidingTabStrip.java


본 예제에서 사용할 패키지는 kr.co.acronym.minitab으로 되어 있다. 위 파일에서 패키지 부분만 변경해서 사용하면 된다. 


이제 메인 액티비티의 레이아웃을 살펴보자. 

activity_main.xml

탭 메뉴를 보여줄 View와 선택한 탭의 내용을 보여줄 FrameLayout으로 구성되어 있다. 

액티비티 자바 파일에서 활용하기 위해 14번째 줄을 보면 FrameLayout에 mini_content_fragment라는 id를 부여했다. 


메인 액티비티 파일은 다음과 같다. 

MainActivity.java

다른 부분은 기본으로 생성된 대로 놔뒀고, onCreate 메소드의 17~22번째 줄에 Fragment를 활용하는 부분이 추가되어 있다. 


이 부분에서 필요한 MiniTabFrament를 Fragment를 상속해서 만들어야 한다. 

MiniTabFragment.java


onCreateVew 메소드를 살펴보면 19번째 줄에서 R.layout.fragment_mini_tabs를 참조하고 있는 것을 볼 수 있다. 

뒤에서 별도의 fragment_mini_tabs.xml을 레이아웃에 만들도록 하자. 

참고로 프레그먼트를 사용할 때는 setContentView()로 레이아웃을 지정하는 것이 아니라, inflater.inflate() 메소드를 사용한다는 것도 알아두자. 


onViewCreated 메소드에서 뷰가 생성된 다음에 ViewPager에 어댑터를 지정하고(24~25번째 줄), SlidingTabLayout에 할당한다. 


이어서 ViewPager에서 사용하는 어댑터 클래스를 만든다. 

34번째 줄의 getCount()는 탭 영역에 보여줄 탭의 개수를 설정하는데, 여기에서는 6개로 지정했다. 

45번찌 줄의 getPageTitle()은 탭에 보여줄 제목을 설정한다. 


InstantiateItem() 메소드는 보여줄 아이템을 초기화 하는 부분이다. 

R.layout.pager_item을 가져와서 만든 View를 컨테이너에 추가하고 있다. (50~54번째 줄)

그리고 pager_item.xml 파일의 item_title 부분에 텍스트를 출력한다. (56~58번째 줄)


마지막으로 destroyItem() 메소드는 컨테이너에 추가한 View를 제거한다. (65~66번째 줄)


이제 레이아웃과 관련된 fragment_mini_tabs.xml과 pager_item.xml을 살펴보자. 

fragment_mini_tabs.xml

SlidingTabLayout은 지정한 패키지를 포함해서 적어줘야 한다. 

여기에서는 kr.co.acronym.minitab.SlidingTabLayout으로 선언되어 있다. 


pager_item.xml


이상으로 안드로이드에서 제공하는 탭 UI/UX에 대해서 살펴봤는데 전체적인 파일 구성은 다음과 같다. 

 

최종 실행 결과는 다음과 같다. 슬라이딩과 탭 클릭 등을 테스트해 보기 바란다. 





Trackback 0 And Comment 0

안드로이드 웹뷰에서 뒤로가기 버튼 처리 - 웹페이지 리다이렉트 경우

|



안드로이드에서 웹뷰를 적용하는 강좌는 지난번에 올렸었다. 

뒤로가기 버튼까지 처리를 했지만, 사용하다 보면 한가지 문제가 발생한다. 


웹 페이지에서 다른 페이지로 이동한 후, 내부적으로 여러번 리다이렉트가 발생할 경우이다. 

이때, 기존의 방식대로 뒤로가기 버튼을 처리하면 원하는대로 동작하지 않는다. 

바로 이전 페이지로 이동하기 때문에 다시 현재 보고 있는 페이지로 돌아오게 되는 것이다. 



이런 문제를 해결하기 위해서 다음과 같은 방식을 사용해봤다. 

현재 URL을 변수에 저장하고 새로운 URL이 로딩되었는데 아직도 현재 URL이면 뒤로 이동하도록 처리하는 것이다. 

WebViewClient를 상속한 클래스의 shouldOverrideUrlLoading 함수에서 처리하면 된다. 


기존 소스에서는 단순히 view.loadUrl(url) 만 처리했었지만, 

내부적으로 URL을 리다이렉트하는 경우를 대비해서 수정을 한 것이다. 


나머지는 mCurrentUrl이라는 변수를 멤버 변수로 선언하고 onCreate에서 null값을 할당해 준 것만 차이가 있다. 

전체 액티비티 소스는 다음과 같다. 




Trackback 0 And Comment 0

안드로이드 인트로 화면 만들기

|



대부분의 앱은 처음 시작할 때 인트로 화면을 제공한다. 

아이폰에서는 기본 이미지(Default.png)를 추가하거나 설정해 주고, 

앱 론칭이 끝났을 때 실행되는 함수에서 일정시간만을 주는 다음 한줄 코드로 인트로 화면이 해결된다. 

[NSThread sleepForTimeInterval:3];


하지만, 안드로이드에서는 인트로를 위한 별도의 기능을 제공해 주지 않는다. 

그렇다고 인트로 화면을 전혀 제공해 줄 수 없는 것은 아니다. 


인트로를 위한 액티비티를 하나 만들고, 앱이 실행될 때 해당 액티비티가 먼저 뜨도록 구성하면 된다. 

그리고 일정 시간이 지나면 실제 처음 나오는 액티비티가 실행되도록 하면 된다. 


AndroidManifest.xml 파일 설정 

먼저 처음 실행하는 액티비티가 인트로 화면이 되도록 AndroidManifest.xml 파일을 수정한다. 


보통 카테고리(category) 태그에 런처로 설정되어 있는 액티비티가 메인 액티비티(MainActivity)로 되어 있을 것이다. 

13번째 줄을 보면, 이 부분을 새롭게 만들 인트로화면(IntroActivity)로 변경한 것이다. 

그리고 메인 액티비티는 21~23번째 줄에 별도로 지정했다. 


인트로 액티비티의 화면 구성 

이제 인트로 액티비티의 화면을 위한 XML 파일을 살펴보자. 


리니어 레이아웃으로 구성하였고, 5번째 줄을 보면 배경으로 사용할 이미지를 지정했다. 

이 이미지가 바로 인트로 화면이라고 보면 된다. 


인트로 이미지의 크기는 안드로이드 화면 크기에 맞춰서 올려줘야 한다. 

보통 밀도단위에 따라 저밀도(ldpi), 중밀도(mdpi), 고밀도(hdpi), 초고밀도(xhdpi), 초초고밀도(xxhdpi)로 나누는데 각각에 적절한 전체화면 해상도는 다음과 같다. 

  • LDPI: Portrait: 200x320px. Landscape: 320x200px.
  • MDPI: Portrait: 320x480px. Landscape: 480x320px.
  • HDPI: Portrait: 480x800px. Landscape: 800x480px.
  • XHDPI: Portrait: 720px1280px. Landscape: 1280x720px.
  • XXHDPI: Portrait: 960px1600px. Landscape: 1600x960px.
  • XXXHDPI: Portrait: 1280px1920px. Landscape: 1920x1280px.



인트로 액티비티 소스 구성

인트로 액티비티에서 수행해야 할 것은 전체 화면으로 띄우고, 일정 시간이 지나면 메인 액티비티를 실행하고 인트로는 중지하면 된다. 

이런 과정은 액티비티가 생성되는 함수에서 처리하면 된다. 


7~8번째 줄은 해당 앱에서 사용하는 액션바를 감춘 것이고, 

12~20번째 줄이 postDelayed 핸들러를 활용해서 2초 후, 메인 액티비티를 실행한 것이다. 

마지막으로 뒤로가기 버튼으로 인트로에 다시 들어오지 못하도록 finish()로 현재 액티비티를 완전히 종료했다. 






Trackback 0 And Comment 0

안드로이드 스튜디오 버전 설정, 아이콘 생성 그리고 릴리즈 빌드하기

|



안드로이드 스튜디오로 개발하는데 있어 기존 방식과 약간 다른 부분이 있어 해당 부분들을 정리해 보려고 한다. 


앱 버전 및 SDK 버전 설정

예전에는 어플 버전을 설정하기 위해 manifest.xml 파일에 versionCode와 versionName을 지정하면 되었다. 

또한 지원하는 안드로이드 버전을 설정하기 위해서는 use-sdk 태그에 minSdkVersion과 targetSdkVersion을 지정했다. 

그러나 안드로이드 스튜디오에서 생성한 프로젝트는 아무리 manifest.xml을 수정해도 적용되지 않는다. 


그 이유는 바로 Gradle Script가 우선 적용되기 때문이다. 


위 그림에서 build.gradle이란 파일을 열어 보면 앱 버전이나 SDK 버전을 설정할 수 있는 스크립트가 있다. 

바로 이 부분을 수정해야 적용이 된다. 


잘 알고 있겠지만 잠깐 각각의 의미를 살펴보자. 

minSdkVersion은 최소로 필요한 SDK 버전으로 하위 호환성에 대한 설정이다. 

최소 버전으로 보통 아이스크림샌드위치 MR1(15)으로 설정하거나 허니콤(11) 으로 지정한다. 

이 경우, 현재 안드로이드의 85% 이상을 커버한다고 한다. 


targetSdkVersion은 앱을 개발할 때 목표로 할 SDK 버전을 나타낸다. 

이 설정이 필요한 이유는 각 SDK 버전별로 시스템이 제공하는 앱 테마와 시스템의 동작 정책이 다르기 때문이다. 


versionCode는 앱 버전의 상대적인 값을 나타내는 정수값이다. 

보통 업그레이드 할 때 이 버전을 올림으로써 구글플레이에서 상위 버전임을 알게 한다. 

versionName은 사용자에게 보여지는 앱의 버전을 나타낸다. 


build.gradle 파일의 다른 부분은 추후 별도로 정리하기로 하자~


아이콘 생성하기

예전에는 프로젝트 생성하면서 아이콘을 설정할 수 있는 마법사 기능이 있었는데, 안드로이드 스튜디오는 기본으로 아이콘을 만들어버린다. 

당연히 없어진 것은 아니다. 

위 그림에서 "res"를 선택하고 마우스의 오른쪽 버튼을 클릭한다. 

그리고 "New" > "Image Asset"을 선택한다. 


상단에서 Asset Types을 Launcher Icons로 선택하고 아이콘을 변경하면 된다. 

파일 이름을 ic_launcher.png로 동일하게 지정하면 "Next"에서 덮어쓸 것인지를 물어보게 된다. 

그러나 기존 아이콘을 그대로 둘 필요가 없으므로 덮어쓰면 된다. 


보통 192x192 정도 큰 아이콘을 만들어 업로드하면 각 DPI에 적합한 아이콘을 자동으로 생성해 준다. 

참고로 DPI별 아이콘의 픽셀 크기는 다음과 같다. 

  • ldpi: 36x36
  • mdpi: 48x48
  • hdpi: 72x72
  • xhdpi: 96x96
  • xxhdpi: 144x144


릴리즈 빌드하기

구글 플레이에 등록하기 위해서 인증서를 생성하고, 릴리즈 빌드하고 APK를 만들어야 한다. 

인증서 생성은 기존대로 keytool을 활용할 수 있지만 상단 "Build" > "Generate Signed APK..."를 사용하면 된다.


아래 화면에서 "Next" 눌러서 이동한 화면에서 새로운 인증서를 만들거나 기존 인증서로 릴리즈 빌드하고 APK를 생성할 수 있다. 


신규로 만들 경우, Create New...를 클릭하고 다음과 같은 항목들을 입력한다. 

향후 업데이트를 위해서 비밀번호는 잘 기억해 두기 바란다. 


릴리즈 빌드가 완료되면 APK 파일은 프로젝트 폴더의 app 폴더 하위에 app-release.apk라는 이름으로 생성된다. 


당연한 이야기지만 한번 만들어진 키스토어 파일과 암호는 잘 보관해야 한다. 

만약 키스토어 파일을 잃어 버리거나 암호를 기억하지 못한다면 다시 그 앱을 업데이트 할 수 없기 때문이다. 




Trackback 0 And Comment 0

이미지로 제공하는 안드로이드 실시간 검색어 앱 추천~

|



최근 핫이슈들을 살펴보기 위해서 네이버, 다음의 실시간 검색어를 자주 살펴본다. 

모바일에서도 포탈 사이트에 접속하지 않고 바로바로 확인하기 위한 앱들을 살펴봤는데

대부분 텍스트 위주의 순위라 결국 다시 포털 사이트에 접속해서 무슨일인지 확인 해야 하는 아쉬움이 있었다. 


이미지로 한번에 살펴보면 더 낫지 않을까?

그리고 궁금하면 포털 사이트로 들어가면 될 것이고.. 


그래서 '실시간 검색' 앱을 만들어봤다. 

실시간 검색어와 이미지는 매 1분마다 업데이트하도록 구성했다. 

네이버와 다음의 실시간 검색어를 아래처럼 이미지로 확인할 수 있다. 


    


안드로이드 사용자는 구글 플레이를 통해 다음 링크를 눌러서 다운로드하면 된다. 

https://play.google.com/store/apps/details?id=kr.co.acronym.realkeyword

사용해보고 추가 의견 있으면 자유롭게 올려주세요~





Trackback 0 And Comment 0

안드로이드 JSON 파싱하기

|



안드로이드에서 웹서버로 통신할 때 주로 사용하는 포맷이 JSON이다. 

웹에 접속해서 데이터를 가져오는 방식은 안드로이드 네트워크 연결하기 (Network On Main Thread Exception 처리) 을 참고하기 바란다. 

이렇게 가져온 데이터가 JSON 타입일 경우, 안드로이드에서 이를 처리해서 배열에 저장해 보자. 


웹에서 가져온 데이터를 JSONArray로 변환하고, For문을 중첩해서 돌리면서 각 항목의 값을 가져오는 것이다. 

그리고 String[][] 2차원 배열에 가져온 값을 저장하는 형태로 매우 간단하다. 

소스를 한번 살펴보자. 


2번째 줄에서 매개변수로 넘어온 result라는 문자열을 JSONArray 타입으로 변환한다. 

8-15째 줄에서 JSONArray의 값을 읽어와 2차원 String 배열에 저장하고 있다. 


마지막으로 LogCat을 이용해 결과를 확인하기 위해 Log.i() 함수로 저장된 값을 출력한다. 


실제 안드로이드 프로젝트에서 테스트해보려면 

위 소스를 안드로이드 네트워크 연결하기 (Network On Main Thread Exception 처리)의 

전체 소스에서 67-68 줄 사이(onPostExecute 메소드)에 넣고 돌려보기 바란다. 


다음과 같은 결과를 얻을 수 있을 것이다. 



참고로 JSON 변환을 하다보면, 다음과 같은 에러메시지를 만날 때가 있다. 

org.json.JSONArray cannot be converted to JSONObject


JSONArray 타입을 JSONObject로 변환할 수 없다는 것으로 두 타입의 차이를 조금 이해할 필요가 있다. 

JSONObject는 {이름:값, 이름:값 ... }로 구성된 하나의 JSON 객체를 나타낸다. 

반면 JSONArray는 [{이름:값, 이름:값 ...}, {이름:값, 이름:값 ...}, {이름:값, 이름:값 ...}, ... ]와 같이 JSONObject가 여러개 중첩되어 있는 것이다. 

이 차이를 안다면 데이터 문자열의 형태에 따라 JSONObject나 JSONArray로 변환함으로써 위와 같은 오류를 만들지는 않을 수 있을 것이다. 




Trackback 0 And Comment 0

안드로이드 네트워크 연결하기 (Network On Main Thread Exception 처리)

|



안드로이드에서 네트워크 연결하기 위해 자바에서처럼 코딩하면 십중팔구는 다음과 같은 오류 메시지를 만난다. 

android.os.NetworkOnMainThreadException


메시지를 살펴보면 Main Thread에서 네트워크를 호출하면서 발생한 오류라고 나온다. 

즉, 안드로이드에서 Main Thread에서는 네트워크 연결을 하지 못하도록 한 것이다. 

아마도 안드로이드 앱에서 네트워크 호출하면서 에러가 발생한 것을 사용자들이 안드로이드의 오류로 인식하기 때문에 그런 듯 하다. 


AsyncTask 쓰레드 클래스 이해

그럼 안드로이드에서는 어떻게 네트워크에 연결할 수 있을까? 

AsyncTask라는 쓰레드 클래스를 상속받아 네트워크 연결하는 부분을 만들면 된다. 


AsyncTask는 상속시 3개의 Generic Type의 매개변수가 필요한데, 

첫번째는 쓰레드를 실행하는 메소드(doInBackground)에서 사용할 매개변수이며,

두번째는 쓰레드가 업데이트될때마다 호출되는 메소드(onProgressUpdate)에서 사용할 Progress 이고, 

세번째는 쓰레드가 완료되면 실행되는 메소드(onPostExecute)에서 사용할 Result의 타입을 나타낸다.


AsyncTask에서 오버라이드할 수 있는 메소드를 호출 순서대로 나열하면 다음과 같다. 

onPreExecute() -> doInBackground(Params... params) -> 

onProgressUpdate(Progress... values) -> onPostExecute(Result result)


아래 살펴볼 예제에서는 간단하게 donInBackground에서 네트워크 연결을 하고, 

onPostExecute에서 화면에 출력하도록 구성했다. 


안드로이드 네트워크 연결 예제


인터넷 접근 권한 설정

먼저 앱에서 네트워크에 접속하기 위한 시스템 권한을 설정한다. 

AndroidManifest.xml 파일에 다음과 같이 설정하면 된다. 

가끔 아래 태그의 위치를 잘못 놓는 경우가 있는데, 부모 엘리먼트는 <manifest>라는 것을 꼭 기억해 두기 바란다. 


android.permission.INTERNET은 인터넷 접속을 위한 권한 설정이고, 

android.permission.ACCESS_NETWORK_STATE는 인터넷 접속이 가능한지 체크하기 위해 네트워크 상태를 볼 수 있는 권한이다. 


레이아웃 설정

예제를 위한 레이아웃을 다음과 같이 설정한다.  (activity_json.xml)


레이아웃은 단순하다. "SEND" 버튼을 클릭하면 웹으로 연결해서 결과값을 가져와서 맨 아래의 텍스트뷰에 뿌려주는 것이다.

SEND 버튼의 클릭 이벤트 처리를 위해서  18번째 줄에 android:onClick="sendData" 를 추가했다. 


액티비티 코딩

"SEND" 버튼을 클릭했을 때 처리를 다음과 같이 구성한다. (JsonActivity.java)


12번째 줄을 보면 네트워크에 연결이 가능한지 살펴보고 난 후, 

13번째 줄에서 DownloadJson이라는 AsyncTask를 상속받은 쓰레드 클래스를 실행하고 있다. 

만약 인터넷 연결이 안되어 있을 경우, Toast로 메시지를 출력하도록 구성했다. 


참고로 데이터로 가져올 URL은 이전 강좌인 PHP를 활용하여 DB 내용을 JSON으로 출력하기 를 참고하기 바란다.


AsyncTask를 상속 받은 웹 연결 쓰레드 코딩

앞서 설명한 doInBackground와 onPostExecute를 오버라이딩해서 구현한 소스는 다음과 같다. 


doInBackground에서는 getData라는 메소드를 호출해서 인터넷 연결해서 데이터를 가져오도록 했다. 

onPostExecute에서는 가져온 데이터를 텍스트뷰에 출력하는 역할을 한다. 


참고로 getData 메소드를 살펴보면 연결을 위해 HTTPURLConnection을 사용하고 있다. 

예전에는 아파치의 HttpClient나 DefaultHttpClient를 사용했으나 허니컴 이후 deprecated 되었다. 


JsonActivity.java의 전체 소스는 다음과 같다. 




Trackback 0 And Comment 1
  1. 미니~ 2015.07.27 00:04 신고 address edit & del reply

    위 글과 관련한 질문이 올라와서 댓글로 남깁니다.

    1. onPostExecute() 함수 호출
    onPostExecute() 함수는 명시적으로 호출하는 것이 아니라
    맨 앞에 설명한 것처럼 AsyncTask를 상속 받은 클래스를 실행할 경우, 순서대로 호출하게 되는 함수 중의 하나입니다.

    즉, onPreExecute() -> doInBackground -> onProgressUpdate-> onPostExecute

    그러므로 47번째 줄에서 new DownloadJson().execute(url); 를 실행하면 onPostExecute()까지 호출되는 것이죠.

    2. getData()의 리턴값
    getData()에서 리턴하는 return sb.toString(); 값이 어디로 가는지에 대한 문의도 있었는데요.

    61번째 줄을 보면 doInBackground에서 getData()를 호출하고
    그 결과값을 리턴하는 것을 확인할 수 있습니다.

    이렇게 되면 AsyncTask에서는 리턴된 결과값을 onPostExecute()함수에 파라미터로 전달하게 됩니다.

    3. 예제 실행시 결과값이 안보이는 경우
    예제를 그대로 따라했는데 결과값이 안 보인다면,

    1) 네트워크 접속이 가능한지 확인하고
    2) 네트워크 접속 권한 설정을 했는지 확인하고
    3) 위 예제에서 layout 파일(activity_json.xml)과 JsonActivity.java 파일을 제대로 작성했는지 확인한번 해보세요~



웹에서 액티비티 호출하기

|



웹앱을 만들다보면, 웹에서 안드로이드 앱의 특정 액티비티를 호출해야 하는 경우가 종종 발생한다. 

오늘은 HTML의 링크를 클릭했을 때, 안드로이드 액티비티를 호출하는 간단한 방식을 정리해 보도록 한다. 


웹뷰를 작성하는 코드는 안드로이드 웹뷰(WebView) 사용하기 를 참고하기 바란다. 

이 소스에 HTML 링크를 처리하는 부분을 추가할 것이기 때문이다. 


웹에서 액티비티 호출 방식

웹에서는 HTML의 <a> 태그를 활용해서 액티비티를 호출한다. 


<a href="app://...">Call Activity</a>

이런 형태로 호출하고, 안드로이드 액티비티에서 URL 로딩하는 부분에서 app://로 시작하는 것을 별도로 처리하면 된다. 


필요에 따라서 app:// 이후 문자열을 가지고 특정 파라미터를 전달하는 형태도 가능할 것이다. 


웹 HTML 소스

간단한 테스트를 위해서 app:// 링크를 가진 HTML 파일을 하나 생성한다. 


웹에서 실행 후, 링크를 눌러보면 아무런 반응을 하지 않는다. 


안드로이드 코딩

안드로이드 웹뷰(WebView) 사용하기 에서 만든 MiniWebActivity에 관련 내용을 추가해 보도록 한다. 

웹의 링크를 받아서 다른 액티비티를 실행할 것이므로 인텐트(intent)를 사용해야 한다. 

이를 위해 ApplicationContext를 알아야 할 필요가 있다. 


5번째 줄에 mContext 변수를 선언하고, 11번째 줄에서 getApplicationContext()로 할당했다. 


이제 URL 로딩에서 app://으로 시작하는 부분을 처리해야 한다. 

안드로이드 웹뷰(WebView) 사용하기 에서 WebViewClient를 상속받아서 WebViewClientClass를 inner class로 구현한 것을 기억할 것이다. 

이 클래스의 URL 로딩을 오버라이드한 메소드에서 app://을 처리하면 된다. 


4~8번째 줄을 보면 URL에서 app://으로 시작할 경우, 

인텐트를 사용해서 MainActivity를 실행하도록 설정되어 있다. 


전체 소스를 살펴보면 다음과 같다. 




Trackback 0 And Comment 1
  1. 지나가던 2018.05.08 16:01 address edit & del reply

    3시간째 삽질하던것을 한방에 해결했습니다 감사합니다

안드로이드 웹뷰(WebView) 사용하기

|



최근 모바일 웹을 앱으로 씌워서 서비스하는 경우가 많아짐에 따라 웹뷰의 활용성도 올라가는 것 같다. 

안드로이드에서 웹뷰(WebView)를 사용하는 기본 방식을 정리해 보도록 한다. 


액티비티 생성

먼저 "File > New > Activity > Blank Activity"를 통해 MiniWebActivity라는 이름의 빈 액티비티를 하나 생성한다. 

생성후 살펴보면 Java에는 MiniWebActivity 파일이 Layout에는 activity_mini_web.xml 파일이 추가된다. 

Menu에도 menu_mini_web.xml이 생성되지만 여기에서는 사용하지 않는다. 


레이아웃 설정

activity_mini_web.xml의 레이아웃 설정은 다음과 같다. 


LinearLayout으로 설정했고 방향(orientation)은 수직(vertical)로 지정했다. 

내부 위젯이 웹뷰 하나이기 때문에 여기에서는 방향이 중요하지는 않다. 

다만, 웹뷰가 화면 전체를 채워야 하므로 너비와 높이(layout_width와 layout_height)는 모두 "match_parent"로 설정했다. 


참고로, tools:context는 해당 레이아웃이 어느 액티비티와 관련되어 있는지 나타낸다고 한다. 

보통 개발 툴의 레이아웃 에디터 디자인에서 사용한다고 한다. 


그리고 "@id+/webView"는 해당 웹뷰에 대한 고유 아이디로서, 

액티비티에서 "findViewById(R.id.webView)"로 검색할 때 사용하기 위한 값이다. 


액티비티 코딩

webActivity에서 웹뷰를 띄우는 코드는 다음과 같다. 


3번째 줄과 같이 mWebView라는 웹뷰 관련 변수를 설정하고, 10번째 줄에서 레이아웃에 설정한 웹뷰를 지정한다. 

11번째 줄은 웹뷰에서 자바스크립트를 허용하기 위해 설정한 부분이다. 

12번째 줄에서 loadUrl을 통해서 처음 이동할 URL을 지정한다. 

13번째 줄은 웹뷰 클라이언트를 지정하는 부분이다. 

만약 이 부분이 생략되면, 안드로이드 OS는 지정한 URL을 기본 브라우저로 실행하게 된다. 


참고로 세로 스크롤을 설정하는 코드를 추가하려면 다음과 같이 한다.  

mWebView.setVerticalScrollBarEnabled(true);

16~22번째 줄에서 웹뷰 클라이언트 클래스를 inner Class로 만들고 shouldOverrideUrlLoading 메소드를 오버라이드한다. 

여기에서는 단순히 지정된 URL을 로딩하는 역할만 처리했다. 


혹시 안드로이드의 뒤로가기 버튼을 클릭했을 때, 웹브라우저의 뒤로가기와 같은 기능을 구현하고 싶을 수도 있다. 

이 경우, MiniWebActivity에서 onKeyDown 메소드를 오버라이드 하면 된다. 

이 소스까지 포함한 전체 MiniWebActivity는 다음과 같다. 


24~30 라인을 보면, KEYCODE_BACK이 눌리고 웹뷰의 뒤로가기가 가능할 경우 웹페이지 뒤로가기를 실행하도록 처리되어 있다. 




Trackback 0 And Comment 0
prev | 1 | 2 | 3 | next