2016-02-29 12 views
5

Ho un MapView all'interno di un frammento che crea un WebView e un URL di caricamento.WebView onPageFinished non chiamato quando MapView è visibile

Il WebView va bene se lo MapView è nascosto (android:visibility="gone"). Ma quando viene reso visibile, viene chiamato il numero onPageStarted() di WebView ma non viene mai chiamato onPageFinished().

MapView:

<com.google.android.gms.maps.MapView 
    android:layout_width="match_parent" 
    android:layout_height="200dp" 
    android:visibility="gone" 
    android:id="@+id/mapView" /> 

WebView:

webView = new WebView(getActivity()); 
webView.addJavascriptInterface(this, "scraper"); 
WebSettings webSettings = webView.getSettings(); 
webSettings.setUserAgentString("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"); 
webSettings.setJavaScriptEnabled(true); 
webSettings.setDomStorageEnabled(true); 

webView.setWebViewClient(new WebViewClient() { 
    @Override 
    public boolean shouldOverrideUrlLoading(WebView view, String url) { 
     return true; 
    } 


    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     super.onPageStarted(view, url, favicon); 
     System.out.println("page start called"); 
    } 

    @Override 
    public void onPageFinished(WebView view, String url) { 
     super.onPageFinished(view, url); 
     System.out.println("page finished called"); 
    } 
}); 

webView.loadUrl("http://denver.craigslist.org/apa/5436947521.html"); 

alcune osservazioni:

  1. Se lascio la mappa Visualizza nascosto, WebView si carica bene.

  2. registrare solo messaggio dopo onPageStarted() - D/cr_Ime: [ImeAdapter.java:587] staccare

  3. Nulla in onReceivedError() o altri callback di errore.

+0

in pratica si dispone di MapView e WebView all'interno di un frammento. Ho ragione ? –

+0

Solo il 'MapView' all'interno di Fragment. Webview è usato come 'webView = new WebView (getActivity());' Quindi puoi dire che appartiene all'attività non questo particolare frammento. –

+0

hai provato la mia soluzione? –

risposta

2

Ho fatto in questo modo, funziona bene per me.

Ho utilizzato MapFragment anziché MapView.

fragment_location.xml:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" > 

    <fragment 
     android:id="@+id/map" 
     android:name="com.google.android.gms.maps.MapFragment" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"/> 

</RelativeLayout> 

LocationFragment.java:

public class LocationFragment extends Fragment implements OnMapReadyCallback { 

private static View view; 
private GoogleMap googleMap; 
private double latitude = 23.0300, longitude = 72.5800; 
private WebView webView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) 
{ 
    if (view != null) { 
     ViewGroup parent = (ViewGroup) view.getParent(); 
     if (parent != null) 
      parent.removeView(view); 
    } 
    try 
    { 
     view = inflater.inflate(R.layout.fragment_location,null); 

     MapFragment mapFragment = (MapFragment) getActivity().getFragmentManager() 
       .findFragmentById(R.id.map); 
     mapFragment.getMapAsync(this); 
    }catch (InflateException e) { 
    /* map is already there, just return view as it is */ 
    } 

    return view; 
} 

@Override 
public void onMapReady(GoogleMap googleMap) { 
    LatLng mLatLong = new LatLng(latitude, longitude); 

    googleMap.setMyLocationEnabled(true); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLngZoom(mLatLong, 13)); 

    googleMap.addMarker(new MarkerOptions() 
      .title("MyTitle") 
      .snippet("MySnippet") 
      .position(mLatLong)); 

    if(webView!=null){ 
     webView.requestFocus(); 
    } 
} 


@Override 
public void onResume() { 
    super.onResume(); 

    webView = new WebView(getActivity()); 
    webView.addJavascriptInterface(this, "scraper"); 
    WebSettings webSettings = webView.getSettings(); 
    webSettings.setUserAgentString("Mozilla/5.0 (Windows NT 5.1; rv:31.0) Gecko/20100101 Firefox/31.0"); 
    webSettings.setJavaScriptEnabled(true); 
    webSettings.setDomStorageEnabled(true); 

    webView.setWebViewClient(new WebViewClient() { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      return true; 
     } 


     @Override 
     public void onPageStarted(WebView view, String url, Bitmap favicon) { 
      super.onPageStarted(view, url, favicon); 
      Log.i("WebView", "page start called"); 
     } 

     @Override 
     public void onPageFinished(WebView view, String url) { 
      super.onPageFinished(view, url); 
      Log.i("WebView", "page finished called"); 
     } 
    }); 

    webView.loadUrl("http://stackoverflow.com/"); 
} 

}

Nel mio caso onPageStarted & onPageFinished entrambi sono sempre attivati.

Schermata:

enter image description here

Edit 1: realtà MapView prendere sempre messa a fuoco durante l'inizializzazione così una volta processo di inizializzazione MapView fatto richiesta di messa a fuoco WebView.

Spero che questo ti possa aiutare.

+0

Questo non ha funzionato. In effetti ho provato con MapFragment 1st e poi spostato su MapView. BTW come è diverso dal codice che ho postato (a parte sostituire MapView con MapFragment). Grazie. –

+0

@ Archie.bpgc, puoi provare a cambiare l'URL con un altro? –

+0

Sì, ho provato con 'webView.loadUrl (" http://stackoverflow.com/ ")' sempre lo stesso. –

-1

Android Webview non supporta la mappa, ecco perché non è visibile.

Problemi correlati