하루에 0.01%라도 성장하자

Develop/Android

Kotlin ) 웹 뷰를 이용한 사이트 이동, 검색앱 만들기.

뚠님 2019. 7. 3. 14:41
반응형

Kotlin

 

간단한 어플이다. WebView를 이용해서 검색앱을 만드는 것이다.

다만, 나는 코틀린으로 했다는 것에? 살짝 의미를 둔다.

그리고 코틀린으로 해보니... 너무 코드가 간결해지고 쉬워졌다.

 

개발된 기능

 

  1. 앱을 켰을때 WebView를 이용해서 메인 사이트를 보여준다.
  2. 옵션 메뉴를 이용한 저장된 사이트 이동.
  3. 암시적 인텐트를 이용한 전화, 문자, 이메일 메뉴 만들기
일부 소스코드

 

[ 웹뷰 소스코드 ]

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() // 없으면 안드로이드 뒤로가기 실행.
    }
}

 

[ 옵션 메뉴 만들기 ]

 

OptionMenu

 

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를 이용하면 이렇게 코드가 간결해진다. 가능하다면 안드로이드 소스코드와 비교하면서 하고 싶지만.. 아직은 그럴여유가 없다..ㅠ

 

굉장히 단순한 코드지만 이런 코드를 작성하면서도 코틀린의 강력함을 느낀다.

반응형