반응형
간단한 어플이다. WebView를 이용해서 검색앱을 만드는 것이다.
다만, 나는 코틀린으로 했다는 것에? 살짝 의미를 둔다.
그리고 코틀린으로 해보니... 너무 코드가 간결해지고 쉬워졌다.
개발된 기능
- 앱을 켰을때 WebView를 이용해서 메인 사이트를 보여준다.
- 옵션 메뉴를 이용한 저장된 사이트 이동.
- 암시적 인텐트를 이용한 전화, 문자, 이메일 메뉴 만들기
일부 소스코드
[ 웹뷰 소스코드 ]
webView.apply {
settings.javaScriptEnabled = true // 자바스크립트가 잘 동작하도록 설정
webViewClient = WebViewClient() // 웹뷰에서 페이지가 뜨도록, 설정 안해주면 기본 브라우저가 실행됨.
}
webView.loadUrl("www.naver.com"); // 실행할 url 입력
[ 키패드 설정 ]
입력된 actionId가 검색이면 url을 실행하고 true를 반환해 종료.
urlEditText.setOnEditorActionListener { _, actionId, _ ->
if (actionId == EditorInfo.IME_ACTION_SEARCH) { // 검색값이 맞다면.
webView.loadUrl(urlEditText.text.toString())
true
} else {
false
}
}
[ 뒤로가기 ]
override fun onBackPressed() {
if (webView.canGoBack()) { // 웹페이지에 뒤로 갈 수 있는 히스토리가 있는지 확인
webView.goBack()
} else {
super.onBackPressed() // 없으면 안드로이드 뒤로가기 실행.
}
}
[ 옵션 메뉴 만들기 ]
override fun onCreateOptionsMenu(menu: Menu?): Boolean {
menuInflater.inflate(R.menu.main, menu)
return true
}
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.action_google -> {
webView.loadUrl("http://www.google.com")
return true
}
R.id.action_naver, R.id.action_home -> {
webView.loadUrl("http://www.naver.com")
return true
}
R.id.action_daum -> {
webView.loadUrl("http://www.daum.net")
return true
}
R.id.action_call -> {
val intent = Intent(Intent.ACTION_DIAL)
intent.data = Uri.parse("tel:031-123-4567")
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
return true
}
R.id.action_send_text -> {
sendSMS("010-1111-2222", webView.url)
return true
}
R.id.action_email -> {
email("test@example.com", "굳", webView.url)
return true
}
}
return super.onOptionsItemSelected(item)
}
[ R.menu.main.xml ]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="Search Site">
<menu
>
<item android:title="네이버" android:id="@+id/action_naver"/>
<item android:title="구글" android:id="@+id/action_google"/>
<item android:title="다음" android:id="@+id/action_daum"/>
</menu>
</item>
<item android:title="DeveloperInfo" android:id="@+id/developerInfo">
<menu
>
<item android:title="전화" android:id="@+id/action_call"/>
<item android:title="문자" android:id="@+id/action_send_text"/>
<item android:title="이메일" android:id="@+id/action_email"/>
</menu>
</item>
<item android:title="Home" android:id="@+id/action_home" android:icon="@drawable/ic_home_black_24dp"
app:showAsAction="ifRoom"/>
</menu>
[ 컨텍스트 메뉴 ]
override fun onCreateContextMenu(menu: ContextMenu?, v: View?, menuInfo: ContextMenu.ContextMenuInfo?) {
super.onCreateContextMenu(menu, v, menuInfo)
menuInflater.inflate(R.menu.context, menu)
}
override fun onContextItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.action_share -> {
share(webView.url)
return true
}
R.id.action_brower -> {
browse(webView.url)
return true
}
}
return super.onContextItemSelected(item)
}
[ contextmenu.xml ]
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android">
<item android:title="페이지 공유" android:id="@+id/action_share"/>
<item android:title="기본 브라우저에서 열기" android:id="@+id/action_brower"/>
</menu>
[ onCreate 에 등록 ]
registerForContextMenu(webView)
[ 암시적 인텐트 ]
override fun onOptionsItemSelected(item: MenuItem?): Boolean {
when (item?.itemId) {
R.id.action_google -> {
webView.loadUrl("http://www.google.com")
return true
}
R.id.action_naver, R.id.action_home -> {
webView.loadUrl("http://www.naver.com")
return true
}
R.id.action_daum -> {
webView.loadUrl("http://www.daum.net")
return true
}
R.id.action_call -> { // 전화걸기
val intent = Intent(Intent.ACTION_DIAL)
intent.data = Uri.parse("tel:031-123-4567")
if (intent.resolveActivity(packageManager) != null) {
startActivity(intent)
}
return true
}
R.id.action_send_text -> { // 문자보내기
sendSMS("010-1111-22222", webView.url)
return true
}
R.id.action_email -> { // 이메일 보내기
email("test@example.com", "굳", webView.url)
return true
}
}
return super.onOptionsItemSelected(item)
}
코틀린 + Anko를 이용하면 이렇게 코드가 간결해진다. 가능하다면 안드로이드 소스코드와 비교하면서 하고 싶지만.. 아직은 그럴여유가 없다..ㅠ
굉장히 단순한 코드지만 이런 코드를 작성하면서도 코틀린의 강력함을 느낀다.
반응형
'Develop > Android' 카테고리의 다른 글
Android ) Handler postDelayed 사용법 (0) | 2019.08.23 |
---|---|
안드로이드 스튜디오 테마를 변경해보자! (0) | 2019.08.09 |
vectorDrawables.useSupportLisbrary (0) | 2019.06.17 |
kotlin-android-extensions 와 Anko 라이브러리 (0) | 2019.06.17 |
Kotlin ) 코틀린 기초 Part#8 - 확장함수, 형변환, 그외 함수 (0) | 2019.06.14 |