웹뷰 임시 정리

Android 2013. 8. 5. 17:39
728x90

# Layout

그냥 <WebView> 태그 넣고 그 안에 속성 넣어주면 끝...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >
      
    <WebView
        android:id="@+id/webView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        />
  
</LinearLayout>



# WebViewClient를 상속받은 클래스 정의

WebViewClient 클래스를 상속받아 구현합니다. 이 안에 shouldOverrideUrlLoading() 메소드를 구현하지 않으면 웹뷰 내 링크 터치할 때 연결 프로그램(기본 브라우저, 크롬 등) 설정창이 뜹니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
import android.webkit.*;
  
class WebBrowserClient extends WebViewClient {
      
    /*
     * 웹뷰 내 링크 터치 시 새로운 창이 뜨지 않고
     * 해당 웹뷰 안에서 새로운 페이지가 로딩되도록 함   
     */
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        view.loadUrl(url);
        return true;
    }
}



# WebView 객체 생성 및 세팅

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import android.webkit.*;
  
public class MainActivity extends Activity {
  
    private WebView webView;
  
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
  
        // 웹뷰 설정
        webView = (WebView)findViewById(R.id.webView);
          
        WebSettings webSettings = webView.getSettings();
        webSettings.setUseWideViewPort(true);
        webSettings.setSupportZoom(true); // 줌 서포터 표시
        webSettings.setBuiltInZoomControls(true); // 멀티터치 줌 지원
        webSettings.setJavaScriptEnabled(true);
          
        webView.setWebViewClient(new WebBrowserClient());
  
        // 웹뷰에 웹 사이트 표시
        String url = "http://www.ldoceonline.com";
        webView.loadUrl(url);
    }
}



# WebView 초기화 방지 

화면 회전시 웹뷰가 초기화되지 않도록 합니다. 액티비티 클래스 안에 onConfigurationChanged() 메소드를 구현합니다.

1
2
3
4
5
6
7
8
9
/*
 * 화면 회전시 화면이 초기화되버리는 문제 방지
 * 매니페스트 액티비티 속성에
 * android:configChanges="orientation|screenSize"
 * 추가 필요
 */
public void onConfigurationChanged(Configuration newConfig){
    super.onConfigurationChanged(newConfig);
}

반드시 매니페스트 파일에 다음과 같이 액티비티 속성을 추가해야 합니다. 

1
2
3
4
5
<activity
    android:name="com.heroism.webviewapp.MainActivity"
    android:configChanges="orientation|screenSize"
    android:label="@string/app_name" >
</activity>



# 뒤로가기 

액티비티 클래스 안에 onKeyDown() 메소드를 구현하면 back 키를 눌렀을때 이전 페이지를 보여주도록 할 수 있습니다. 이때 canGoBack() 메소드로 이전 페이지로 이동할 수 있는지 판단한 후 goBack() 메소드를 호출하여 이전 페이지를 보여줍니다.

첫 페이지 상에서 back 키를 연속으로 두 번 터치하면 앱을 종료시키게 할 수 있습니다. 이 코드는 이곳(http://hyvaa.tistory.com/97) 을 참고했습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
// 핸들러, 플래그
private Handler mHandler;
private boolean mFlag = false;
  
// 핸들러 객체 설정 (onCreate() 메소드 안에 구현!!!)
mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        if(msg.what == 0) {
            mFlag = false;
        }
    }
}
  
public boolean onKeyDown(int keyCode, KeyEvent event) {
       
    // 백 키를 터치한 경우
    if(keyCode == KeyEvent.KEYCODE_BACK){
           
        // 이전 페이지를 볼 수 있다면 이전 페이지를 보여줌
        if(webView.canGoBack()){
            webView.goBack();
            return false;
        }
           
        // 이전 페이지를 볼 수 없다면 백키를 한번 더 터치해서 종료
        else {
            if(!mFlag) {
                Toast.makeText(this, "'뒤로' 버튼을 한번 더 누르시면 종료됩니다.", Toast.LENGTH_SHORT).show();
                mFlag = true;
                mHandler.sendEmptyMessageDelayed(0, 2000); // 2초 내로 터치시 
                return false;
            } else {
                finish();
            }
        }
    }
       
    return super.onKeyDown(keyCode, event);
}

 

728x90
Posted by 정망스
,


맨 위로
홈으로 ▲위로 ▼아래로 ♥댓글쓰기 새로고침