android - Webview onPageFinished never called -
i have came weird scenario of using android webview widget:
i have 2 activities, let's call them , b. has button , webview. clicking button in launch b. b has webview.
here problem: urls, "onpagefinished()" method of webviewclient (which set on b) never called, if activity still on stack. if call finish() on when launching b, "onpagefinished()" called.
so seems me existence of webview in has effect on other webview in b. why that? how can solve problem?
this problem happens on os 4.4 devices. os 5.x or os 4.0, code works perfectly.
here source code:
public class mainactivity extends actionbaractivity { private viewgroup browsercontainer; private webview browser; private progressbar progressbar; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); this.setcontentview(r.layout.activity_main); this.getsupportactionbar().setdisplayhomeasupenabled(true); this.getsupportactionbar().sethomebuttonenabled(true); getsupportactionbar().setbackgrounddrawable(getresources().getdrawable(r.color.background_material_dark)); browsercontainer = (viewgroup) findviewbyid(r.id.webview_container); progressbar = (progressbar) findviewbyid(r.id.progress_bar); browser = (webview) findviewbyid(r.id.message_view); browsercontainer.setvisibility(view.invisible); browser.setwebviewclient(new webviewclient() { @override public void onpagefinished(webview view, string url) { super.onpagefinished(view, url); browsercontainer.setvisibility(view.visible); progressbar.setvisibility(view.gone); } }); browser.loadurl("http://www.google.com"); button nextbtn = (button)findviewbyid(r.id.next); nextbtn.setonclicklistener(new view.onclicklistener() { @override public void onclick(view v) { intent = new intent(mainactivity.this, webviewactivity.class); startactivity(i); // uncomment below line fix problem // finish(); } }); } @suppresslint("newapi") @override public void onresume() { super.onresume(); if (build.version.sdk_int >= 11) { browser.onresume(); } } @suppresslint("newapi") @override public void onpause() { super.onpause(); if (build.version.sdk_int >= 11) { browser.onpause(); } }} public class webviewactivity extends actionbaractivity { private webview browser; private progressbar progressbar; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); this.setcontentview(r.layout.activity_webview); this.getsupportactionbar().setdisplayhomeasupenabled(true); this.getsupportactionbar().sethomebuttonenabled(true); getsupportactionbar().setbackgrounddrawable(getresources().getdrawable(r.color.background_material_dark)); progressbar = (progressbar) findviewbyid(r.id.progress_bar); browser = (webview) findviewbyid(r.id.message_view); browser.setvisibility(view.invisible); browser.setwebviewclient(new webviewclient() { @override public void onpagefinished(webview view, string url) { super.onpagefinished(view, url); showmessage(); } }); if (savedinstancestate == null) { // below url contains <video> component. string url = "http://techslides.com/sample-webm-ogg-and-mp4-video-files-for-html5" ; browser.loadurl(url); } } @suppresslint("newapi") @override public void onresume() { super.onresume(); if (build.version.sdk_int >= 11) { browser.onresume(); } } @suppresslint("newapi") @override public void onpause() { super.onpause(); if (build.version.sdk_int >= 11) { browser.onpause(); } } @override public boolean onoptionsitemselected(menuitem item) { switch(item.getitemid()) { case android.r.id.home: this.finish(); return true; } return false; } /** * reveals message. */ private void showmessage() { browser.setvisibility(view.visible); progressbar.setvisibility(view.gone); }} activity_main.xml:
<?xml version="1.0" encoding="utf-8"?> <framelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <linearlayout android:id="@+id/webview_container" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <button android:id="@+id/next" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="next"/> <webview android:id="@+id/message_view" android:layout_width="match_parent" android:layout_height="match_parent"/> </linearlayout> <progressbar android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:progressbarstylelarge" android:layout_gravity="center"/> </framelayout> activity_webview.xml:
<?xml version="1.0" encoding="utf-8"?> <framelayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <webview android:id="@+id/message_view" android:layout_width="match_parent" android:layout_height="match_parent"/> <progressbar android:id="@+id/progress_bar" android:layout_width="wrap_content" android:layout_height="wrap_content" style="?android:progressbarstylelarge" android:layout_gravity="center"/> </framelayout>
it turns out html content retrieved webview in b activity has video tag. problem if video tag not have "preload" or "poster" attribute, onpagefinished() method never called. bug reported here. fix problem, modify html content add "preload=none" or "poster". me, because don't own content, have download content programmatically, add "preload=none", , feed content webview. hack, it's best can think of now.
Comments
Post a Comment