🚩앱 화면에 웹 브라우저 넣기

웹뷰(WebView) : 웹브라우저를 앱 안에 넣을 때 사용한다.

                            인터넷에 접속하므로 매니페스트에 인터넷 접속 권한과 속성이 등록되어있어야한다.

 

1️⃣activity_main.xml

Widgets에 WebView가 들어있다.

🔸코드🔸

더보기
<?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:id="@+id/main"
    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"
        android:orientation="horizontal">

        <Button
            android:id="@+id/button"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_weight="0.1"
            android:text="열기"
            android:textSize="20sp" />

        <EditText
            android:id="@+id/EditText"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_margin="5dp"
            android:layout_weight="2"
            android:background="@drawable/textbox"
            android:gravity="center_vertical"
            android:hint="URL"
            android:padding="10dp" />
    </LinearLayout>

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

2️⃣MainActivity.java

package com.example.chapter8_3;

public class MainActivity extends AppCompatActivity {
    EditText editText;
    WebView webView;

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

        editText = findViewById(R.id.EditText);
        webView = findViewById(R.id.WebView);

        WebSettings webSettings = webView.getSettings();
        // getSettings 메서드를 사용해 webSettings 객체를 참조한다.
        webSettings.setJavaScriptEnabled(true);
        // setJavaScriptEnable 값이 true로 설정되면 자바스크립트가 동작할 수 있는 환경이 된다.
        webView.setWebViewClient(new ViewClient());

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new android.view.View.OnClickListener() {
            @Override
            public void onClick(android.view.View view) {
                // 버튼 클릭 시 사이트 로딩하기.
                webView.loadUrl(editText.getText().toString());
                // loadUrl 메서드를 사용하면 원격지의 웹페이지를 열거나 로컬에 저장된 HTML 파일을 열 수 있다.
            }
        });
    }

    private class ViewClient extends WebViewClient{
        @Override
        public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
            view.loadUrl(url);
            return true;
        }
    }
}

 

🔹WebSettings

WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webView.setWebViewClient(new ViewClient());

대부분의 웹사이트가 자바스크립트를 사용하므로, setJavaScriptEnabled의 값은 항상 true로 설정하는 것이 좋다.

관련 있는 메서드 : loadUrl, goForward, goBack

 

🔹WebViewClient를 상속받은 ViewClient

private class ViewClient extends WebViewClient{
    @Override
    public boolean shouldOverrideUrlLoading(final WebView view, final String url) {
        view.loadUrl(url);
        return true;
    }
}

왜 새롭게 WebViewClient를 만든건지는 잘 모르겠다.

(재정의한 메서드는 파라미터를 둘 다 final로 바꿔주고, 안에 내용물이 좀 바뀌긴 했는데 그냥 ViewClient를 쓰면 안되나?)

(책에 설명이 부족해서 아쉽다.)

 

3️⃣AndroidManifest.xml

아래 코드를 추가해준다.

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

    <application
        android:usesCleartextTraffic="true"

 

4️⃣실행 결과

URL을 입력하고 버튼을 누르면 해당 사이트가 웹뷰 안에서 열린다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

🚩시크바

시크바(SeekBar) : 프로그레스바를 확장하여 만든 것. 핸들(Handle) 드래그, 터치한 부분으로 이동되는 기능이 추가됨.

                              (ex. 볼륨 조절, 재생 위치 조절)

OnSeekBarChangeListener를 설정하여 이벤트 처리 가능.

 

[주요 메서드]

  • onStartTrackingTouch
  • onStopTrackingTouch
  • onProgressChanged : 사용자에 의해 변경된 progress 값을 전달받을 수 있다.

fromUser 파라미터를 사용하면 변경된 값이 사용자가 입력한 것인지 아니면 코드에서 변경된 것인지 구별할 수 있다.

 

1️⃣activity_main.xml

🔸전체코드🔸

더보기

시크바의 속성 중 max라는 것이 있다. 최대값을 설정해줄 수 있다. (여기선 100으로 설정)

<?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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <SeekBar
        android:id="@+id/seekBar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:max="100"
        android:padding="30dp" />

    <TextView
        android:id="@+id/textView"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:text="변경된 값"
        android:textSize="30sp" />
</LinearLayout>

2️⃣MainActivity.java

package com.example.chapter8_4;

public class MainActivity extends AppCompatActivity {

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

        TextView textView = findViewById(R.id.textView);
        SeekBar seekBar = findViewById(R.id.seekBar);
        seekBar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
            @Override
            public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
                setBrightness(i);
                textView.setText("변경된 값: "+i);
            }

            @Override
            public void onStartTrackingTouch(SeekBar seekBar) {}

            @Override
            public void onStopTrackingTouch(SeekBar seekBar) {}
        });
    }

    private void setBrightness(int value){
        if(value<10){
            value=10;
        }
        else if(value>100){
            value=100;
        }
        // 10~100 사이의 값.

        WindowManager.LayoutParams params = getWindow().getAttributes();
        params.screenBrightness = (float)value/100; // 윈도우에서 밝기의 값은 0~1인가보다.
        getWindow().setAttributes(params);
    }

}

 

onProgressChanged 메서드 내부에 새로 만든 setBrightness 메서드를 입력한다.

setBrightness 메서드에서 i 값을 전달받아 화면 밝기를 조절한다. (근데 실행해봤는데.. 밝기조절이 되는지 잘 모르겠음)

 

getAttributes, setAttributes

 

3️⃣실행결과

에뮬레이터에서 실행해봤을 때 딱히 밝기의 변화를 느낄 수 없었다.. (화면 밝기 조절에 대해 좀 더 알아봐야겠다.)

근데 밝기 변화를 구현하더라도 생각해보니 캡처를 해도 밝기 변화는 캡처가 되지 않아서 실행사진은 지금과 차이는 없겠다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

🚩키패드 제어하기

InputMethodManager : 키패드와 관련된 기능이 사용가능한 객체.

                                      이 객체는 시스템 서비스이므로 getSystemService 메서드로 참조한 후 키패드를 제어할 수 있다.

 

[ 키패드 제어가 필요한 경우 ]

  • 아이디, 비밀번호 입력 후 로그인이 성공하면 키패드가 자동으로 닫혀야한다.
  • 입력상자에 숫자만 입력해야할 때 키패드가 숫자용 키패드로 나타나야한다. (이 경우 inputType 속성을 설정해야 함.)

[ 대표적인 inputType 속성값 ]

  • number : 숫자
  • numberSigned : 0보다 큰 숫자
  • numberDecimal : 정수
  • text : 텍스트
  • textPassword : 패스워드로 표시
  • textEmailAddress : 이메일로 표시
  • phone : 전화번호로 표시
  • time : 시간
  • date : 날짜

1️⃣activity_main.xml

editText의 inputType을 number로 지정해준다.

 

2️⃣MainActivity.java

package com.example.chapter8_5;

public class MainActivity extends AppCompatActivity {

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

        Button button = findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(getCurrentFocus()!=null){ // 포커스를 받고 있을 경우
                    InputMethodManager inputMethodManager = (InputMethodManager) getSystemService(INPUT_METHOD_SERVICE);
                    inputMethodManager.hideSoftInputFromWindow(getCurrentFocus().getWindowToken(),0);
                }
            }
        });
    }
}

 

3️⃣AndroidManifest.xml

이걸 설정해주지 않으면, 앱 실행 시 화면이 보임과 동시에 입력상자가 포커스를 받으면서 키패드가 자동으로 올라온다.

        <activity
            android:name=".MainActivity"
            android:windowSoftInputMode="stateHidden"

이 코드 추가 시 앱을 실행해도 키패드가 올라오지 않는다.

 

4️⃣실행결과

'키패드 닫기' 버튼을 클릭하면 키패드가 감춰진다.

 

이번 장은 좀 가벼웠다. 빨리 끝냄.