2022. 10. 10. 15:46ㆍDev.Program/Android
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);
}
}
}
- 최종코드
'Dev.Program > Android' 카테고리의 다른 글
여러 Activity (0) | 2022.10.10 |
---|---|
Fragment / 메뉴와 대화상자 / Context_Menu / Toast (0) | 2022.10.10 |
TextView / ProgressBar / SeekBar / RatingBar (0) | 2022.10.10 |
Layout / Chronometer / TimePicker / DatePicker / CalendarView (0) | 2022.10.10 |
CheckBox / RadioButton / Toggle / ImageView (0) | 2022.10.10 |