ScrollView / SlidingDrawer / ViewFlipper / WebView

2022. 10. 10. 15:46Dev.Program/Android

728x90

27p

< ScrollView >

======== 0619_ch06_ScrollView_Basic

< activity_main,xml >

<?xml version="1.0" encoding="utf-8"?>

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

   android:orientation="vertical">

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:orientation="vertical">

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼1"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼2"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼3"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼4"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼5"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼6"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼7"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="match_parent"

           android:layout_height="100dp"

           android:text="버튼8"

           android:textSize="20sp"/>

 

   </LinearLayout>

 

</ScrollView>

  • 버튼 8개 넣기(버튼 여러개를 넣기 위해 리니어 레이아웃으로 감싸기)
  •  
    실행화면

 

======== 0619_ch06_ScrollView_Basic2

<?xml version="1.0" encoding="utf-8"?>

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

   android:orientation="horizontal">

 

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:orientation="horizontal">

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼1"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼2"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼3"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼4"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼5"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼6"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼7"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="100dp"

           android:text="버튼8"

           android:textSize="20sp"/>

 

   </LinearLayout>

 

</HorizontalScrollView>

  •  
    가로로 스크롤할 수 있다



< SlidingDrawer >

p29 서랍(숨기는 개념이 아님)

======== 0619_ch06_slidingDrawer_Basic

SlidingDrawer 생성 방법

1. <SlidingDrawer> 태그 정의

2. <SlidingDrawer> 태그 내에 handle, content 속성 정의

2-1. handle 속성에 사용되는 id 는 핸들로 사용되는 위젯 id 를 지정(주로 버튼)

2-2. content 속성에 사용되는 id 핸들 클릭 또는 당겼을 때 표시될 위젯 id를 지정(주로 레이아웃)

 

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

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <TextView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="여기는 서랍 밖입니다"

       android:textSize="20sp"/>

 

 

   <!--

       SlidingDrawer 생성 방법

       1. <SlidingDrawer> 태그 정의

       2. <SlidingDrawer> 태그 내에 handle, content 속성 정의

          2-1. handle 속성에 사용되는 id 는

               핸들로 사용되는 위젯 id 를 지정(주로 버튼)

          2-2. content 속성에 사용되는 id 는

               핸들 클릭 또는 당겼을 때 표시될 위젯 id를 지정

               (주로 레이아웃)

   -->

   <SlidingDrawer

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:handle="@id/btnHandle"

       android:content="@id/layoutContent">

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:id="@+id/btnHandle"

           android:text="서랍 손잡이"

           android:textSize="20sp"/>

 

       <LinearLayout

           android:layout_width="match_parent"

           android:layout_height="match_parent"

           android:orientation="vertical"

           android:id="@+id/layoutContent"

           android:background="#FF0000">

 

           <TextView

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:text="여기는 서랍 안입니다"

               android:textSize="20sp"/>

 

       </LinearLayout>

 

   </SlidingDrawer>

 

</LinearLayout>

  • id 값 가져옴
  • 실행화면
  • 손잡이 누르면 드래그 됨!

 

> 서랍 속의 서랍 만들어보기

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

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <TextView

       android:layout_width="wrap_content"

       android:layout_height="wrap_content"

       android:text="여기는 서랍 밖입니다"

       android:textSize="20sp"/>

 

 

   <!--

       SlidingDrawer 생성 방법

       1. <SlidingDrawer> 태그 정의

       2. <SlidingDrawer> 태그 내에 handle, content 속성 정의

          2-1. handle 속성에 사용되는 id 는

               핸들로 사용되는 위젯 id 를 지정(주로 버튼)

          2-2. content 속성에 사용되는 id 는

               핸들 클릭 또는 당겼을 때 표시될 위젯 id를 지정

               (주로 레이아웃)

   -->

   <SlidingDrawer

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:handle="@id/btnHandle"

       android:content="@id/layoutContent">

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:id="@+id/btnHandle"

           android:text="서랍 손잡이"

           android:textSize="20sp"/>

 

       <LinearLayout

           android:layout_width="match_parent"

           android:layout_height="match_parent"

           android:orientation="vertical"

           android:id="@+id/layoutContent"

           android:background="#FF0000">

 

           <TextView

               android:layout_width="wrap_content"

               android:layout_height="wrap_content"

               android:text="여기는 서랍 안입니다"

               android:textSize="20sp"/>

 

           <SlidingDrawer

               android:layout_width="match_parent"

               android:layout_height="match_parent"

               android:handle="@id/btnHandle2"

               android:content="@id/layoutContent2">

 

               <Button

                   android:layout_width="wrap_content"

                   android:layout_height="wrap_content"

                   android:id="@+id/btnHandle2"

                   android:text="서랍 손잡이2"

                   android:textSize="20sp"/>

 

               <LinearLayout

                   android:layout_width="match_parent"

                   android:layout_height="match_parent"

                   android:orientation="vertical"

                   android:id="@+id/layoutContent2"

                   android:background="#00FF00">

 

                   <TextView

                       android:layout_width="wrap_content"

                       android:layout_height="wrap_content"

                       android:text="서랍 안의 서랍"

                       android:textSize="20sp"/>

 

               </LinearLayout>

 

           </SlidingDrawer>

 

 

       </LinearLayout>

 

   </SlidingDrawer>

 

</LinearLayout>

  • 리니어 레이아웃 안에 슬라이딩 드로우가 있으니까 2번째 서랍도 똑같이 리니어 레이아웃 안에 슬라이딩 드로우를 넣어줌!
  • 실행화면
  • 이렇게 중첩해서 쓸 일은 없는데 중첩으로도 가능하다는 거!

 

< ViewFlipper >

======== 0619_ch06_ViewFlipper_Basic

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

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:orientation="horizontal">

 

       <Button

           android:layout_width="0dp"

           android:layout_height="wrap_content"

           android:layout_weight="1"

           android:id="@+id/btnPrev"

           android:text="이전화면"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="0dp"

           android:layout_height="wrap_content"

           android:layout_weight="1"

           android:id="@+id/btnNext"

           android:text="다음화면"

           android:textSize="20sp"/>

 

   </LinearLayout>

 

</LinearLayout>

  • 버튼 두개
  • 리니어 레이아웃을 3개 넣어서 이전화면 누르면 1번이 뜨고 다음화면 누르면 2번이 뜨게 (평소에는 3번 화면이 보이고) ⇐ 화면전환

 

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

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:orientation="horizontal">

 

       <Button

           android:layout_width="0dp"

           android:layout_height="wrap_content"

           android:layout_weight="1"

           android:id="@+id/btnPrev"

           android:text="이전화면"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="0dp"

           android:layout_height="wrap_content"

           android:layout_weight="1"

           android:id="@+id/btnNext"

           android:text="다음화면"

           android:textSize="20sp"/>

 

   </LinearLayout>

 

   <ViewFlipper

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:id="@+id/viewFlipper">

       <!-- 화면 전환을 통해 표시할 위젯들을 정의 -->

       <LinearLayout

           android:layout_width="match_parent"

           android:layout_height="match_parent"

           android:background="#FF0000">

 

           <TextView

               android:layout_width="match_parent"

               android:layout_height="wrap_content"

               android:text="첫번째 LinearLayout"

               android:textSize="30sp"/>

 

       </LinearLayout>

 

       <LinearLayout

           android:layout_width="match_parent"

           android:layout_height="match_parent"

           android:background="#00FF00">

 

           <TextView

               android:layout_width="match_parent"

               android:layout_height="wrap_content"

               android:text="두번째 LinearLayout"

               android:textSize="30sp"/>

 

       </LinearLayout>

 

       <LinearLayout

           android:layout_width="match_parent"

           android:layout_height="match_parent"

           android:background="#0000FF">

 

           <TextView

               android:layout_width="match_parent"

               android:layout_height="wrap_content"

               android:text="세번째 LinearLayout"

               android:textSize="30sp"/>

 

       </LinearLayout>

 

   </ViewFlipper>

 

</LinearLayout>

  • 뷰 플리퍼 안에 화면 세개 만들기

 

< MainActivity.java >

package com.example.a0619_ch06_viewflipper_basic;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.widget.Button;

import android.widget.ViewFlipper;

 

public class MainActivity extends AppCompatActivity {

 

   Button btnPrev, btnNext;

   ViewFlipper viewFlipper;

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       btnPrev = findViewById(R.id.btnPrev);

       btnNext = findViewById(R.id.btnNext);

       viewFlipper = findViewById(R.id.viewFlipper);

 

   }

}

  • 아이디값 들고오기

 

@Override

protected void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);

   setContentView(R.layout.activity_main);

 

   btnPrev = findViewById(R.id.btnPrev);

   btnNext = findViewById(R.id.btnNext);

   viewFlipper = findViewById(R.id.viewFlipper);

 

   // 이전화면 버튼 클릭 시 ViewFlipper 객체의 showPrevious() 메서드 호출

   btnPrev.setOnClickListener(new View.OnClickListener() {

       @Override

       public void onClick(View v) {

           viewFlipper.showPrevious();

       }

   });

   // 다음화면 버튼 클릭 시 ViewFlipper 객체의 showNext() 메서드 호출

   btnNext.setOnClickListener(new View.OnClickListener() {

       @Override

       public void onClick(View v) {

           viewFlipper.showNext();

       }

   });

 

}

  • 이전 / 다음

  • 뷰플리퍼는 순서대로 화면이 보임(점프가 안된다)


< 자동 전환 >

  • 쇼핑몰 같은 곳 보면 시간 지나면 자동으로 전환되는,, 그런거

< activity_main.xml >

<Button

   android:layout_width="0dp"

   android:layout_height="wrap_content"

   android:layout_weight="1"

   android:id="@+id/btnAuto"

   android:text="전환시작"

   android:textSize="20sp"/>

  • 이전화면과 다음화면 사이에 “전환시작” 버튼 하나 추가

  • lollipop 이랑 rabbit 사진 추가하기

<ImageView

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:src="@drawable/lollipop"/>

<ImageView

   android:layout_width="wrap_content"

   android:layout_height="wrap_content"

   android:src="@drawable/rabbit"/>

  • 세번째 LinearLayout 밑에 이미지 추가

 

< MainActivity.java >

// 전환시작 버튼 클릭 시 자동으로 화면전환

btnAuto.setOnClickListener(new View.OnClickListener() {

   @Override

   public void onClick(View v) {

       if(btnAuto.getText().equals("전환시작")) {

           viewFlipper.startFlipping(); // 자동 화면전환 시작

           btnAuto.setText("전환중지");

       } else {

           viewFlipper.stopFlipping(); // 자동 화면전환 중지

           btnAuto.setText("전환시작");

       }

   }

});

  • 자동전환 됨!
  • 근데 딜레이가 너무 길다
  • viewFlipper.setFlipInterval(1000); ⇐ millisec 단위로 받기 때문에 1000 넣음(=1초)
  • 한 줄 추가해주면 아까보다 빨리 전환됨




탭호스트는 잠깐 뛰어넘음

48p 웹뷰

< WebView >

======== 0619_ch06_WebView_Basic

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

   tools:context=".MainActivity"

   android:orientation="vertical">

 

   <LinearLayout

       android:layout_width="match_parent"

       android:layout_height="wrap_content"

       android:orientation="horizontal">

 

       <EditText

           android:layout_width="wrap_content"

           android:layout_height="match_parent"

           android:layout_weight="1"

           android:id="@+id/etUrl"

           android:hint="URL을 입력하세요"

           android:singleLine="true"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:id="@+id/btnGo"

           android:text="이동"

           android:textSize="20sp"/>

 

       <Button

           android:layout_width="wrap_content"

           android:layout_height="wrap_content"

           android:id="@+id/btnBack"

           android:text="이전"

           android:textSize="20sp"/>

 

   </LinearLayout>

 

   <WebView

       android:layout_width="match_parent"

       android:layout_height="match_parent"

       android:id="@+id/webView"/>

 

</LinearLayout>

  • EditText 가 가로로만 넓어지도록 singleLine = true

 

# tip

  • 앱 제목에 아이콘 뜨도록 해볼거!
  • drawable 폴더에 web.png 넣기

< MainActivity.java >

 

 

setTitle("웹브라우저(WebView)");

getSupportActionBar().setDisplayShowHomeEnabled(true);

getSupportActionBar().setIcon(R.drawable.web);

  • 추가하기
  • 제목에 이미지 넣을 수 있음!

 

<<<<<<<< 참고

 

< MainActivity.java >

public class MainActivity extends AppCompatActivity {

 

   EditText etUrl;

   Button btnGo, btnBack;

   WebView webView;

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       etUrl = findViewById(R.id.etUrl);

       btnGo = findViewById(R.id.btnGo);

       btnBack = findViewById(R.id.btnBack);

       webView = findViewById(R.id.webView);

 

   }

 

}

  • 아이디 가져오기

 

etUrl.setOnClickListener(new View.OnClickListener() {

   @Override

   public void onClick(View v) {

       String url = etUrl.getText().toString();

       Toast.makeText(MainActivity.this, url, Toast.LENGTH_SHORT).show();

   }

});

 

btnGo.setOnClickListener(new View.OnClickListener() {

   @Override

   public void onClick(View v) {

       String url = etUrl.getText().toString();

   }

});

 

btnBack.setOnClickListener(new View.OnClickListener() {

   @Override

   public void onClick(View v) {

       // 이전 페이지로 이동

       webView.goBack();

       // 다음 페이지 : webView.goforward();

   }

});

  • 클릭 이벤트 처리

 

// 내부 클래스 형태로 WebViewClient 클래스의 상속을 받는 서브클래스 MyWebViewClient 정의

class MyWebViewClient extends WebViewClient {

   // shouldOverrideUrlLoading() 메서드 오버라이딩

   @Override

   public boolean shouldOverrideUrlLoading(WebView view, String url) {

       return super.shouldOverrideUrlLoading(view, url);

   }

}

  • 클래스 바깥에 WebViewClient 상속받는 서브클래스 정의하기

  • 오버라이딩 단축키 Ctrl + O

url 을 직접 받지 말라고 위에껀 deprecated 설정되어있는데 지금은 그냥 간편하게 이거 사용

 

package com.example.a0619_ch06_webview_basic;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.view.View;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

   EditText etUrl;

   Button btnGo, btnBack;

   WebView webView;

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       setTitle("웹브라우저(WebView)");

       // 앱 타이틀 바 아이콘 표시를 위한 설정

       getSupportActionBar().setDisplayShowHomeEnabled(true);

       getSupportActionBar().setIcon(R.drawable.web);

 

       etUrl = findViewById(R.id.etUrl);

       btnGo = findViewById(R.id.btnGo);

       btnBack = findViewById(R.id.btnBack);

       webView = findViewById(R.id.webView);

 

       // webView를 동작시키기 위한 작업

       // 1. WebView 객체의 setWebView() 메서드 호출하여 내부클래스로 정의한

       //    WebViewClient 클래스의 상속을 받는 서브클래스 MyWebViewClient 의 인스턴스를 파라미터로 전달

       webView.setWebViewClient(new MyWebViewClient());

 

       etUrl.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               String url = etUrl.getText().toString();

//                Toast.makeText(MainActivity.this, url, Toast.LENGTH_SHORT).show();

 

               // WebView 객체의 loadUrl() 메서드를 호출하여 입력받은 URL 을 파라미터로 전달

               webView.loadUrl(url);

           }

       });

 

       btnGo.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               String url = etUrl.getText().toString();

               // WebView 객체의 loadUrl() 메서드를 호출하여 입력받은 URL 을 파라미터로 전달

               webView.loadUrl(url);

           }

       });

 

       btnBack.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               // 이전 페이지로 이동

               webView.goBack();

               // 다음 페이지 : webView.goforward();

           }

       });

 

   }

 

   // 내부 클래스 형태로 WebViewClient 클래스의 상속을 받는 서브클래스 MyWebViewClient 정의

   class MyWebViewClient extends WebViewClient {

       // shouldOverrideUrlLoading() 메서드 오버라이딩

       @Override

       public boolean shouldOverrideUrlLoading(WebView view, String url) {

           return super.shouldOverrideUrlLoading(view, url);

       }

   }

 

}

  • 안 뜨는 이유! 코드는 다 짰지만 몇가지 설정이 필요함

 

> 권한 설정

  • android:usesCleartextTraffic="true"
  • true 주기
  • 암호화되지 않은 텍스트들의 작업을 허용하는 거!

  • 작업에 대한 권한 설정
  • 안드로이드에서 가장 중요!
  • <uses-permission android:name="android.permission.INTERNET"/>
  • 우린 인터넷 자원을 사용하기때문에 INTERNET 추가

# tip

  • 여기서도 어플 제목과 어플제목 앞 로고 설정 가능!

 

> 다시 실행해보기!

안될때)

  • 설정에 앱 및 알림 들어가기
  • 앱 모두보기
  • 거기서 우리가 만든 앱 클릭
  • 설치제거 후 다시 실행해보기!

 

  • 이제 잘 나온다!



       // webView를 동작시키기 위한 작업

       // 1. WebView 객체의 setWebView() 메서드 호출하여 내부클래스로 정의한

       //    WebViewClient 클래스의 상속을 받는 서브클래스 MyWebViewClient 의 인스턴스를 파라미터로 전달

       // 2. 이벤트 처리를 통해 입력된 주소를 WebView 객체의 loadUrl() 메서드 파라미터로 전달

       // 3. AndroidManifest.xml 파일에 설정 내용 추가

       //    3-1. <application> 태그 내에 android:usesCleartextTraffic="true" 속성 추가

       //    3-2. <application> 태그 밖에 INTERNET 권한 추가

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

       //    => 주의! 3번 설정 후에 ACCESS_DENIED 오류 메세지 보일 경우 앱 삭제 후 재설치

       webView.setWebViewClient(new MyWebViewClient());

 

       etUrl.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               String url = etUrl.getText().toString();

//                Toast.makeText(MainActivity.this, url, Toast.LENGTH_SHORT).show();

 

               // ----------------------------------

               // URL 주소의 앞부분에 "http://" 프로토콜 문자열이 포함되어 있는지 판별

//                if(!url.substring(0, 7).equalsIgnoreCase("http://")) {

//                    // URL 앞부분에 "http://" 를 붙여서 주소 생성

//                    url = "http://" + url;

//                    etUrl.setText(url);

//                }

 

               // 또는 주소를 소문자로 전체 변환한 뒤 "http://" 로 시작하는지 판별

               if(!url.toLowerCase().startsWith("http://")) {

                   // URL 앞부분에 "http://" 를 붙여서 주소 생성

                   url = "http://" + url;

                   etUrl.setText(url);

               }

               // ----------------------------------

 

               // WebView 객체의 loadUrl() 메서드를 호출하여 입력받은 URL 을 파라미터로 전달

               webView.loadUrl(url);

           }

       });

  • “http://” 로 시작하는지 제어한 뒤, http:// 로 시작

 

// 웹뷰에 추가적인 설정

// => 반드시 WebView 객체로 부터 WebSettings 객체를 가져와야함

WebSettings webSetting = webView.getSettings();

 

// 웹브라우저의 확대/축소 버튼 부착

webSetting.setBuiltInZoomControls(true);

// 웹브라우저에서 자바스크립트 실행 활성화(기본값 false 로 비활성화 상태)

webSetting.setJavaScriptEnabled(true);

 

       etUrl.setOnKeyListener(new View.OnKeyListener() {

           @Override

           public boolean onKey(View v, int keyCode, KeyEvent event) {

               if(keyCode == KeyEvent.KEYCODE_ENTER) {

                   String url = etUrl.getText().toString();

//                Toast.makeText(MainActivity.this, url, Toast.LENGTH_SHORT).show();

 

                   // ----------------------------------

                   // URL 주소의 앞부분에 "http://" 프로토콜 문자열이 포함되어 있는지 판별

//                if(!url.substring(0, 7).equalsIgnoreCase("http://") && !url.substring(0, 7).equalsIgnoreCase("https://")) {

//                    // URL 앞부분에 "http://" 를 붙여서 주소 생성

//                    url = "http://" + url;

//                    etUrl.setText(url);

//                }

 

                   // 또는 주소를 소문자로 전체 변환한 뒤 "http://" 로 시작하는지 판별

                   if(!url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://")) {

                       // URL 앞부분에 "http://" 를 붙여서 주소 생성

                       url = "http://" + url;

                       etUrl.setText(url);

                   }

                   // ----------------------------------

 

                   // WebView 객체의 loadUrl() 메서드를 호출하여 입력받은 URL 을 파라미터로 전달

                   webView.loadUrl(url);

               }

               return false;

           }

       });

  • onClickListener 에서 onKeyListener 로 변경

 

< MainActivity.java >

package com.example.a0619_ch06_webview_basic;

 

import androidx.appcompat.app.AppCompatActivity;

 

import android.os.Bundle;

import android.view.KeyEvent;

import android.view.View;

import android.webkit.WebSettings;

import android.webkit.WebView;

import android.webkit.WebViewClient;

import android.widget.Button;

import android.widget.EditText;

import android.widget.Toast;

 

public class MainActivity extends AppCompatActivity {

 

   EditText etUrl;

   Button btnGo, btnBack;

   WebView webView;

 

   @Override

   protected void onCreate(Bundle savedInstanceState) {

       super.onCreate(savedInstanceState);

       setContentView(R.layout.activity_main);

 

       setTitle("웹브라우저(WebView)");

       // 앱 타이틀 바 아이콘 표시를 위한 설정

       getSupportActionBar().setDisplayShowHomeEnabled(true);

       getSupportActionBar().setIcon(R.drawable.web);

 

       etUrl = findViewById(R.id.etUrl);

       btnGo = findViewById(R.id.btnGo);

       btnBack = findViewById(R.id.btnBack);

       webView = findViewById(R.id.webView);

 

       // webView를 동작시키기 위한 작업

       // 1. WebView 객체의 setWebView() 메서드 호출하여 내부클래스로 정의한

       //    WebViewClient 클래스의 상속을 받는 서브클래스 MyWebViewClient 의 인스턴스를 파라미터로 전달

       // 2. 이벤트 처리를 통해 입력된 주소를 WebView 객체의 loadUrl() 메서드 파라미터로 전달

       // 3. AndroidManifest.xml 파일에 설정 내용 추가

       //    3-1. <application> 태그 내에 android:usesCleartextTraffic="true" 속성 추가

       //    3-2. <application> 태그 밖에 INTERNET 권한 추가

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

       //    => 주의! 3번 설정 후에 ACCESS_DENIED 오류 메세지 보일 경우 앱 삭제 후 재설치

       webView.setWebViewClient(new MyWebViewClient());

 

       // 웹뷰에 추가적인 설정

       // => 반드시 WebView 객체로 부터 WebSettings 객체를 가져와야함

       WebSettings webSetting = webView.getSettings();

 

       // 웹브라우저의 확대/축소 버튼 부착

       webSetting.setBuiltInZoomControls(true);

       // 웹브라우저에서 자바스크립트 실행 활성화(기본값 false 로 비활성화 상태)

       webSetting.setJavaScriptEnabled(true);

 

       etUrl.setOnKeyListener(new View.OnKeyListener() {

           @Override

           public boolean onKey(View v, int keyCode, KeyEvent event) {

               if(keyCode == KeyEvent.KEYCODE_ENTER) {

                   String url = etUrl.getText().toString();

//                Toast.makeText(MainActivity.this, url, Toast.LENGTH_SHORT).show();

 

                   // ----------------------------------

                   // URL 주소의 앞부분에 "http://" 프로토콜 문자열이 포함되어 있는지 판별

//                if(!url.substring(0, 7).equalsIgnoreCase("http://") && !url.substring(0, 7).equalsIgnoreCase("https://")) {

//                    // URL 앞부분에 "http://" 를 붙여서 주소 생성

//                    url = "http://" + url;

//                    etUrl.setText(url);

//                }

 

                   // 또는 주소를 소문자로 전체 변환한 뒤 "http://" 로 시작하는지 판별

                   if(!url.toLowerCase().startsWith("http://") && !url.toLowerCase().startsWith("https://")) {

                       // URL 앞부분에 "http://" 를 붙여서 주소 생성

                       url = "http://" + url;

                       etUrl.setText(url);

                   }

                   // ----------------------------------

 

                   // WebView 객체의 loadUrl() 메서드를 호출하여 입력받은 URL 을 파라미터로 전달

                   webView.loadUrl(url);

               }

               return false;

           }

       });

 

       btnGo.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               String url = etUrl.getText().toString();

               // WebView 객체의 loadUrl() 메서드를 호출하여 입력받은 URL 을 파라미터로 전달

               webView.loadUrl(url);

           }

       });

 

       btnBack.setOnClickListener(new View.OnClickListener() {

           @Override

           public void onClick(View v) {

               // 이전 페이지로 이동

               webView.goBack();

               // 다음 페이지 : webView.goforward();

           }

       });

 

   }

 

   // 내부 클래스 형태로 WebViewClient 클래스의 상속을 받는 서브클래스 MyWebViewClient 정의

   class MyWebViewClient extends WebViewClient {

       // shouldOverrideUrlLoading() 메서드 오버라이딩

       @Override

       public boolean shouldOverrideUrlLoading(WebView view, String url) {

           return super.shouldOverrideUrlLoading(view, url);

       }

   }

 

}

  • 최종코드



728x90