Notice
Recent Posts
Recent Comments
Tags
- TempData
- php 캐쉬제거
- 타임피커
- ASP.Net Core 404
- SSD 복사
- ViewBag
- jquery 바코드
- ViewData
- asp.net dropdownlist
- 하드 윈도우 복사
- Mac Oracle
- 바코드 스캔하기
- XSS PHP
- django 엑셀불러오기
- 바코드 생성하기
- asp.net Select
- 파일업로드 체크
- javascript redirection
- jquery 바코드생성
- 파일업로드 유효성체크
- javascript 유효성체크
- XSS방어
- 말줄임표시
- javascript 바코드스캔
- 하드 마이그레이션
- asp.net core Select
- 404에러페이지
- 강제이동
- 맥 오라클설치
- javascript 바코드 생성
웹개발자의 기지개
[안드로이드] javascript 의 window.open , window.close 연동하기 본문
안드로이드
[안드로이드] javascript 의 window.open , window.close 연동하기
http://portfolio.wonpaper.net 2021. 7. 13. 07:38우리가 웹브라우저에 이미 탑재된 기능이라 지나칠수 있는데, 새창 띄우기 기능인 javascript 의 window.open 함수도 안드로이상에서는 따로 만들어 주어야 한다.
아래의 소스중에 WebChromeClient 상속받은 MyWebChromeClient 클래스내에 onCreateWindow 함수가 바로 이놈인데 이를 오바라이딩 해주도록 하자.
아래 소스는 window.open 창이 Dialog 형태로 그안에 newView 형태로 열리는데,
필자가 엄청 삽질했던 부분이 open 은 잘되는데, close 가 안되어 한참 애먹었었다.
결국, 64라인, 65라인이 핵심이다.
dialog.dismiss();
newWebView.loadUrl("javascript:self.close();");
dialog 를 닫고,
javascript:self.close() 를 돌려서, 77라인의 onCloseWindow 함수가 돌아가도록 하는것이다.
[ MainActivity.java ]
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
private WebView webView1;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView1 = (WebView) findViewById(R.id.webView1);
webView1.setWebChromeClient(new MyWebChromeClient());
webView1.setWebViewClient(new WebViewClientClass(getApplicationContext()));
webView1.loadUrl("http://www.naver.com");
}
// WebView 에서 url 변경시 그대로 이동되도록
public class WebViewClientClass extends WebViewClient {
private String TAG = "WebViewClientClass";
private Context mApplicationContext = null;
public WebViewClientClass(Context _applicationContext) {
mApplicationContext = _applicationContext;
}
@Override
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) {
Log.d("WebViewClient URL : ", request.getUrl().toString());
view.loadUrl(request.getUrl().toString());
return true;
// return super.shouldOverrideUrlLoading(view, request);
}
}
public class MyWebChromeClient extends WebChromeClient {
private final String TAG = "MyWebChromeClient";
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
Log.i(TAG,"onProgressChanged(view:"+view.toString()+ ", newProgress:"+newProgress+")");
}
@Override
public boolean onCreateWindow(WebView view, boolean isDialog, boolean isUserGesture, Message resultMsg) {
Log.i(TAG, "window.open 협의가 필요합니다.");
WebView newWebView = new WebView(view.getContext());
WebSettings webSettings = newWebView.getSettings();
WebSettings settings = newWebView.getSettings();
settings.setJavaScriptEnabled(true);
settings.setJavaScriptCanOpenWindowsAutomatically(true);
settings.setSupportMultipleWindows(true);
//final Dialog dialog = new Dialog(view.getContext(),R.style.Theme_DialogFullScreen);
final Dialog dialog = new Dialog(view.getContext()); dialog.setContentView(newWebView);
dialog.show();
dialog.setOnKeyListener(new DialogInterface.OnKeyListener() {
@Override
public boolean onKey(DialogInterface dialog, int keyCode, KeyEvent event) {
if (keyCode == KeyEvent.KEYCODE_BACK) {
dialog.dismiss();
newWebView.loadUrl("javascript:self.close();"); return true;
} else {
return false;
}
}
});
newWebView.setWebViewClient(new WebViewClientClass(view.getContext()));
newWebView.setWebChromeClient(new MyWebChromeClient() {
@Override
public void onCloseWindow(WebView window) {
dialog.dismiss();
window.destroy(); }
});
WebView.WebViewTransport transport = (WebView.WebViewTransport) resultMsg.obj;
transport.setWebView(newWebView);
resultMsg.sendToTarget();
return true;
}
@Override
public void onCloseWindow(WebView window) {
Log.i(getClass().getName(), "onCloseWindow");
window.setVisibility(View.GONE);
window.destroy();
//mWebViewSub=null;
super.onCloseWindow(window);
}
@Override
public boolean onJsAlert(WebView view, String url, String message, final JsResult result) {
Log.i(getClass().getName(), "onJsAlert() url:"+url+", message:"+message);
//return super.onJsAlert(view, url, message, result);
new AlertDialog.Builder(view.getContext())
.setTitle("")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new AlertDialog.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.confirm();
} })
.setCancelable(false)
.create()
.show();
return true;
}
@Override
public boolean onJsConfirm(WebView view, String url, String message, final JsResult result) {
Log.i(getClass().getName(), "onJsConfirm() url:"+url+", message"+message);
//return super.onJsConfirm(view, url, message, result);
new AlertDialog.Builder(view.getContext())
.setTitle("")
.setMessage(message)
.setPositiveButton(android.R.string.ok,
new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.confirm();
} })
.setNegativeButton(android.R.string.cancel, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
result.cancel();
} })
.create()
.show();
return true;
}
}
}
|
cs |
참고 : https://helloit.tistory.com/303
'안드로이드' 카테고리의 다른 글
[안드로이드] 기기 및 네트워크 악용 정책 위반, 앱등록 거부시 해결 (0) | 2021.09.09 |
---|---|
[안드로이드] Android Webview 상에서 파일다운로드 기능 구현 (0) | 2021.07.13 |
[안드로이드] 로딩중 ProgressDialog 이용하기 (0) | 2021.03.26 |
[안드로이드] GPS 현재 좌표값(위도,경도) 으로 주소정보(시도,구군) 얻기 (0) | 2021.03.25 |
[안드로이드] E/Google Maps Android API: Authorization failure. 구글맵 연동시 권한 에러가 날때 (0) | 2021.03.25 |
Comments