dalgorithm
달공의 개발기
dalgorithm
전체 방문자
오늘
어제
  • 분류 전체보기 (170)
    • Back-end (0)
    • Java (11)
    • 자료구조 (7)
    • Network (31)
    • Database (9)
    • Baekjoon Online (24)
    • 클라우드 (6)
    • Android (15)
      • Kotlin (14)
    • AI (27)
      • Machine Learning&Deep Learn.. (27)
    • Web (23)
      • Webhacking (17)
      • WebProgramming (6)
    • 기술면접 (1)
      • JAVA&자료구조 (0)
      • Spring (0)
      • 컴퓨터구조&운영체제 (0)
      • 네트워크 (0)
      • 데이터베이스 (0)
    • CTF 스터디 (15)
    • 대외활동 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • java
  • kotlin
  • 자료구조
  • 네트워크
  • 데이터베이스
  • 인공지능
  • 포너블
  • CTF
  • 클라우드
  • 자바
  • 코드리뷰
  • 딥러닝
  • python #백준
  • 침입탐지
  • Guacamole
  • gcp
  • 머신러닝
  • cs
  • db
  • 웹해킹

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
dalgorithm

달공의 개발기

Kotlin 나만의 웹브라우저 만들기
Android/Kotlin

Kotlin 나만의 웹브라우저 만들기

2021. 1. 22. 12:02
728x90

✔ 웹브라우저 기능

- URL 주소를 입력하여 검색버튼을 누르면 웹페이지가 화면에 표시된다.

- 옵션메뉴는 하위메뉴로 검색사이트와 개발자 정보로 구성된다.

- 홈아이콘을 클릭하면 미리 설정한 홈페이지가 표시된다.

 

✔ 소스코드

◾ activity_main.xml

- WebView와 메뉴, 옵션 메뉴, 컨텍스트 메뉴를 사용

- 웹페이지 주소 공유 방법은 암시적 인텐트 이용

 

+imeOptions에서 actionSearch를 선택해서 키보드 아이콘을 체크->돋보기로 변경.

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/urlEditText"
        android:layout_width="203dp"
        android:layout_height="44dp"
        android:layout_marginTop="8dp"
        android:ems="10"
        android:hint="http://"
        android:imeOptions="actionSearch"
        android:inputType="textUri"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <WebView
        android:id="@+id/webView"
        android:layout_width="408dp"
        android:layout_height="544dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="1.0"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/urlEditText"
        app:layout_constraintVertical_bias="1.0" />

    <Button
        android:id="@+id/backButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:text="Back"
        app:layout_constraintEnd_toStartOf="@+id/forwardButton"
        app:layout_constraintStart_toEndOf="@+id/urlEditText"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/forwardButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:text="Forward"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toEndOf="@+id/backButton"
        app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>

 

◾ MainActivity.kt

- MainActivity 코틀린 파일을 작성하기전에 안드로이드에서 특정권한이 필요한 동작을 할 때, 권한을 추가    해줘야한다.

- AndroidManifest.xml 파일에 인터넷 권한을 추가해준다.

  <uses-permission android:name="anroid.permission.INTERNET">

- webView.apply를 통해 웹뷰 기본 설정해주기

- actionId == EditorInfo.IME_ACTION_SEARCH //검색버튼에 해당하는 상수와 비교 

package com.example.mywebbrowser

import android.content.Intent
import android.net.Uri
import android.net.UrlQuerySanitizer
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.ContextMenu
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.view.inputmethod.EditorInfo
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.Button
import android.widget.EditText

class MainActivity : AppCompatActivity() {

    lateinit var webView :WebView
    lateinit var urlEditText : EditText
    lateinit var backButton : Button
    lateinit var forwardButton : Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        webView = findViewById<WebView>(R.id.webView)
        urlEditText = findViewById(R.id.urlEditText)
        backButton =findViewById(R.id.backButton)
        forwardButton = findViewById(R.id.forwardButton)

        webView.apply{
            settings.javaScriptEnabled = true
            webViewClient = WebViewClient()
        }

        webView.loadUrl("http://www.google.com")

        registerForContextMenu(webView) //웹뷰위젯에 컨텍스트 위젯 사용

        backButton.setOnClickListener {
            webView.goBack()
        }

        forwardButton.setOnClickListener {
            webView.goForward()
        }

        urlEditText.setOnEditorActionListener { v, actionId, event ->
            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_reset->{
                webView.reload()
            }
            R.id. action_google,R.id.action_home->{
                webView.loadUrl("http://www.google.com")
                return true
            }
            R.id.action_naver->{
                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:012-3456-7890")
                if(intent.resolveActivity(packageManager)!=null){
                    startActivity(intent)
                }
                return true
            }
            R.id.action_send_text->{
                //문자하기
                val intent = Intent(Intent.ACTION_SENDTO)
                intent.data=Uri.parse("smsto:"+Uri.encode("012-3456-7890"))
                if(intent.resolveActivity(packageManager)!=null){
                    startActivity(intent)
                }
                return true
            }
            R.id.action_email->{
                //이메일하기
                val intent = Intent(Intent.ACTION_DIAL)
                intent.data=Uri.parse("mailto:example@example.com")
                if(intent.resolveActivity(packageManager)!=null){
                    startActivity(intent)
                }
                return true
            }
        }
        return super.onOptionsItemSelected(item)
    }

    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 -> {
                val intent=Intent(Intent.ACTION_SEND)
                intent.putExtra(Intent.EXTRA_TEXT, webView.url.toString())
                intent.setType("text/plain")
                val shareIntent=Intent.createChooser(intent, "공유 페이지")
                startActivity(shareIntent)
                return true
            }
            R.id.action_browser->{
                val intent=Intent(Intent.ACTION_VIEW, Uri.parse(webView.url))
                startActivity(Intent.createChooser(intent,"Browser"))
                return true
            }
        }
        return super.onContextItemSelected(item)
    }
}

 

◾ 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="검색 사이트" >
        <menu >
            <item
                android:id="@+id/action_naver"
                android:title="네이버" />
            <item
                android:id="@+id/action_google"
                android:title="구글" />
            <item
                android:id="@+id/action_daum"
                android:title="다음" />
        </menu>
    </item>
    <item android:title="개발자 정보" >
        <menu >
            <item
                android:id="@+id/action_call"
                android:title="전화하기" />
            <item
                android:id="@+id/action_send_text"
                android:title="문자보내기" />
            <item
                android:id="@+id/action_email"
                android:title="이메일보내기" />
        </menu>
    </item>
    <item
        android:id="@+id/action_home"
        android:icon="@drawable/ic_baseline_home_24"
        android:title="Home"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_reset"
        android:icon="@drawable/ic_baseline_refresh_24"
        android:title="reset"
        app:showAsAction="ifRoom" />
</menu>

 

728x90

'Android > Kotlin' 카테고리의 다른 글

Kotlin 실로폰 만들기  (0) 2021.01.25
Kotlin 수평측정기 만들기  (0) 2021.01.22
Kotlin 타이머 만들기  (0) 2021.01.18
Kotlin BMI(비만도) 계산기 앱 만들기  (0) 2021.01.18
Kotlin 간단 계산기 앱 만들기  (0) 2021.01.13
    'Android/Kotlin' 카테고리의 다른 글
    • Kotlin 실로폰 만들기
    • Kotlin 수평측정기 만들기
    • Kotlin 타이머 만들기
    • Kotlin BMI(비만도) 계산기 앱 만들기
    dalgorithm
    dalgorithm

    티스토리툴바