본문 바로가기

안드로이드/코드

[안드로이드] 웹뷰 사용하기 - WebView

반응형

 

 

 

 

 

 

 

 

웹뷰를 사용해서 간단하게 웹페이지를 띄우는 예제를 만들어보겠습니다.

 

 

1. AndroidManifest.xml

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

인터넷 기능을 사용하기 위해서 인터넷 권한을 줘야 합니다.

 

 

<application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:usesCleartextTraffic="true"
        android:theme="@style/AppTheme">
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

 

android:usesCleartextTraffic="true" 를 추가해줍니다.

 

추가하셔야 err_name_not_resolved 에러가 뜨지 않습니다.

더 자세한 사항은 링크를 참고해주세요

2. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/et"
            android:layout_width="0dp"
            android:layout_weight="1"
            android:layout_height="wrap_content"
            android:hint="http://"
            android:imeOptions="actionSearch"
            android:maxLines="1"
            android:inputType="textUri"/>
        
        <Button
            android:id="@+id/bt"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:onClick="onClick"
            android:visibility="gone"
            android:text="이동"/>
        

    </LinearLayout>

    <WebView
        android:id="@+id/wv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"></WebView>


</LinearLayout>

 

 

 

3. menu_main.xml

 

res폴더 안에 menu폴더를 만들고 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:id="@+id/action_back"
        android:icon="@drawable/ic_arrow_back"
        android:title="뒤로가기"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_forward"
        android:icon="@drawable/ic_arrow_forward"
        android:title="앞으로가기"
        app:showAsAction="ifRoom" />
    <item
        android:id="@+id/action_refresh"
        android:icon="@drawable/ic_refresh"
        android:title="새로고침"
        app:showAsAction="ifRoom" />
</menu>

 

 

 

4. MainActivity.java

import android.content.Context;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.KeyEvent;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private EditText et;
    private WebView wv;
    private Button bt;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        et = findViewById(R.id.et);
        wv = findViewById(R.id.wv);
        bt = findViewById(R.id.bt);

        WebSettings webSettings = wv.getSettings();

        //자바 스크립트 사용을 할 수 있도록 합니다.
        webSettings.setJavaScriptEnabled(true);


        wv.setWebViewClient(new WebViewClient(){
            //페이지 로딩이 끝나면 호출됩니다.
            @Override
            public void onPageFinished(WebView view,String url){
                Toast.makeText(MainActivity.this,"로딩 끝", Toast.LENGTH_SHORT).show();
            }
        });

        //
        et.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if(actionId == EditorInfo.IME_ACTION_SEARCH){
                    //bt의 onClick을 실행
                    bt.callOnClick();

                    //키보드 숨기기
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(),0);
                    return true;
                }
                return false;
            }
        });

    }

    public void onClick(View view) {
        String address = et.getText().toString();
        
        //http://를 넣지 않고 웹주소를 입력했을 경우 http://를 추가해줍니다.
        //예를 들어 naver.com을 검색했을때 http://naver.com이 입력되도록 해줍니다. 
        if(!address.startsWith("http://")){
            address = "http://" + address;
        }
        
        //웹뷰 로드
        wv.loadUrl(address);
    }

    @Override
    public void onBackPressed() {
        //뒤로가기 버튼을 눌렀을때 웹뷰가 뒤로가기가 가능하다면 뒤로가기를 해줍니다.
        if(wv.canGoBack()){
            wv.goBack();
        }else {
            super.onBackPressed();
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            //뒤로가기가 가능할때 뒤로가기
            case  R.id.action_back:
                if(wv.canGoBack()){
                    wv.goBack();
                }
                return true;
            
            //앞으로가기가 가능할때 앞으로가기
            case R.id.action_forward:
                if(wv.canGoForward()){
                    wv.goForward();
                }
                return true;
        
            //새로고침
            case R.id.action_refresh:
                wv.reload();
                return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

 

 

반응형