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

Popular posts from this blog

javascript - Bootstrap Popover: iOS Safari strange behaviour -

Magento/PHP - Get phones on all members in a customer group -

session - Logging Out Using PHP -