[android] 구글 검색 앱

dyke·2022년 8월 5일

android

목록 보기
3/5
post-thumbnail

(참고) 제가 작성하는 android studio의 기준은
Chipmunk 2021.2.1 Patch 1 입니다.

이번에 바인딩과 웹뷰를 사용하기위한 예제로 다른분의 코드를 참고하여 구글 검색 앱을 만들어보았습니다.

개발환경

  • android studio Chipmunk 2021.2.1 Patch 1
  • kotlin 1.6.10

build 참고

plugins {
    id 'com.android.application' version '7.2.1' apply false
    id 'com.android.library' version '7.2.1' apply false
    id 'org.jetbrains.kotlin.android' version '1.6.10' apply false
}

...

android {
    compileSdk 32

    defaultConfig {
        applicationId "com.example.myapp"
        minSdk 26
        targetSdk 32
        versionCode 1
        versionName "1.0"

        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }

    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
        }
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    kotlinOptions {
        jvmTarget = '1.8'
    }

    viewBinding {
        enabled = true
    }
}

activity_main.xml

<?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">

    <FrameLayout
        android:id="@+id/frameLayout"
        android:layout_width="350dp"
        android:layout_height="400dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.488"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent"
        app:layout_constraintVertical_bias="0.254">

        <WebView
            android:id="@+id/webView"
            android:layout_width="350dp"
            android:layout_height="400dp">

        </WebView>

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

    </FrameLayout>

    <EditText
        android:id="@+id/searchView"
        android:layout_width="220dp"
        android:layout_height="40dp"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.064"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/frameLayout"
        app:layout_constraintVertical_bias="0.294" />

    <Button
        android:id="@+id/button"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginStart="8dp"
        android:layout_marginTop="8dp"
        android:layout_marginEnd="8dp"
        android:layout_marginBottom="8dp"
        android:text="검색"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.968"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/frameLayout"
        app:layout_constraintVertical_bias="0.315" />

</androidx.constraintlayout.widget.ConstraintLayout>

사용한 요소들

  • WebView
  • EditText
  • Button

MainActivity.kt

import android.annotation.SuppressLint
import android.content.Intent
import android.graphics.Bitmap
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.view.KeyEvent
import android.view.View
import android.view.inputmethod.EditorInfo
import android.webkit.WebSettings
import android.webkit.WebView
import android.webkit.WebViewClient
import android.widget.TextView
import com.example.myapp.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    private val binding by lazy {
        ActivityMainBinding.inflate(layoutInflater) //바인딩 (findViewById보다 속도 빠름.)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        binding.progressBar.visibility = View.GONE //로딩바 가리기 (공간차지 X)

        initWebView() //웹뷰 초기화

        /* 검색버튼 클릭시 검색*/
        binding.button.setOnClickListener(object : View.OnClickListener {
            override fun onClick(v: View?) {
                binding.webView.loadUrl("https://www.google.co.kr/search?q="+binding.searchView.text) //구글검색시 주소 뒤에 q부터 붙여 검색
            }
        })

    }

        /* 웹뷰 초기화 */
        @SuppressLint("SetJavaScriptEnabled") //javascript 사용시, XSS 경고가 뜨기 때문에 막기위해 사용.
        fun initWebView() {
            //1. 웹뷰클라이언트 연결(로딩 시작 / 끝 받아오기)
            binding.webView.webViewClient = object : WebViewClient() {
                //1) 로딩 시작
                override fun onPageStarted(view: WebView?, url: String?, favicon: Bitmap?) {
                    super.onPageStarted(view, url, favicon)
                    binding.progressBar.visibility = View.VISIBLE //로딩이 시작되면 로딩바 보이기
                }

                //2) 로딩 끝
                override fun onPageFinished(view: WebView?, url: String?) {
                    super.onPageFinished(view, url)
                    binding.progressBar.visibility = View.GONE //로딩이 끝나면 로딩바 없애기
                }

                //3)외부 브라우저가 아닌 웹뷰 자체에서 url 호출
                override fun shouldOverrideUrlLoading(view: WebView?, url: String?): Boolean {
                    if (view != null && url != null) {
                        view.loadUrl(url)
                        return true
                    }
                    return false
                }
            }

            //2. WebSetting: 웹뷰의 각종 설정을 정하기
            val ws : WebSettings = binding.webView.settings
            //3. 자바스크립트 사용 허가
            ws.javaScriptEnabled = true
            //4. 웹페이지 호출
            binding.webView.loadUrl("https://www.google.co.kr")
        }

        /* 뒤로가기 동작 컨트롤 */
        override fun onBackPressed() {
            if(binding.webView.canGoBack()) { //이전페이지가 있으면
                binding.webView.goBack() //이전페이지로 이동
            } else {
                super.onBackPressed() //없으면 앱 종료
            }
        }
}

결과

참고
https://jhshjs.tistory.com/57

profile
web full-stack 지향하는 코린이

0개의 댓글