2012-01-05 11 views
10

Estaba revisando los tutoriales de Android y probé el ejemplo WebView. Esto es lo que terminó con:¿WebView necesita un WebViewClient para funcionar?

WebAppActivity

public class WebAppActivity extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     WebView wv = (WebView) findViewById(R.id.webView1); 
     wv.loadUrl("http://www.google.com"); 

    } 
} 

main.xml

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

    <WebView 
     android:id="@+id/webView1" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" > 
    </WebView> 

</LinearLayout> 

Pero en lugar de cargar la página de la aplicación en sí, tan pronto como la aplicación inicia el navegador predeterminado de Android se abre y la página se carga en el navegador en lugar de la aplicación. Cuando presiono hacia atrás, vuelvo a la actividad de la aplicación que muestra una pantalla en blanco.

¿Alguien sabe por qué sucede esto?

Editar:

manifiesta

<uses-sdk android:minSdkVersion="7" /> 
<uses-permission android:name="android.permission.INTERNET"/> 

<application 
    android:icon="@drawable/ic_launcher" 
    android:label="@string/app_name" > 
    <activity 
     android:label="@string/app_name" 
     android:name=".WebAppActivity" > 
     <intent-filter > 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
</application> 

Ésta era sólo para mostrar que he añadido el permiso INTERNET

Editar:

Tan pronto como añado WebViewClient,

wv.setWebViewClient(new WebViewClient() {}); 

se carga la página en la aplicación. ¿Es este comportamiento esperado? ¿Requiere Android WebView un WebViewClient? (no pudieron encontrar ninguna documentación sobre el mismo)

Editar:

me di cuenta de que este problema se produce cuando se instala el APK en un emulador que tiene las API de Google. En un emulador normal (sin las API de Google) se comporta como se esperaba.

+1

su pregunta ya está respondida en: http://stackoverflow.com/questions/2378800/android-webview-click-opens-default-browser – ariefbayu

+0

@silent Por favor, lea cuidadosamente. Esa no es mi pregunta. Tengo problemas para cargar la primera página, que se carga en el navegador en lugar de en la aplicación. Ver el comentario de Flo –

+1

No, no creo que esté hablando de enlaces en la página web en sí que se hizo clic. Esto parece que la página web nunca se carga en WebView. – Flo

Respuesta

3

Sí, usted tiene que fijar un WebViewClient que devuelve verdadero en el 'shouldOverrideUrlLoading' overrided método para que su vista web cargar la URL en su aplicación.

Avísame si quieres un ejemplo.


Editar

@Aki WebViewClient.shouldOverrideUrlLoading Documentation

Dar la aplicación host la oportunidad de asumir el control cuando una nueva url está a punto de ser cargada en la vista Web actual. Si no se proporciona WebViewClient, de manera predeterminada, WebView solicitará a Activity Manager que elija el controlador adecuado para la url.Si se proporciona WebViewClient, return true significa que la aplicación host maneja la url, mientras que return false significa que la WebView actual maneja la url.

+0

@Christopher ¿Por qué necesitamos un webViewClient solo en el caso de dispositivos con google apis? Por otra parte, ¿puedes señalarme alguna documentación oficial de Android que establezca este hecho? –

+0

@Aki edited answer – ChristopheCVB

+0

Gracias Christopher.Pero no dice en ningún lugar que se llame a 'shouldOverrideUrlLoading' cuando invocamos el método' loadUrl'. –

0
private WebView webVenue; 
private WebSettings websettings; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) 
    { 

     super.onCreate(savedInstanceState); 
     requestWindowFeature(Window.FEATURE_NO_TITLE); 
     setContentView(R.layout.schedule_time); 

     webVenue = (WebView)findViewById(R.id.webview_schedule_time); 
     txtEmptyMsg = (TextView)findViewById(R.id.txtEmptyMsg); 

     mContext = this;   
     webVenue.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
     webVenue.getSettings().setJavaScriptEnabled(true); 
     websettings=webVenue.getSettings(); 
     webVenue.setScrollBarStyle(ScrollView.SCROLLBARS_OUTSIDE_OVERLAY); 
     webVenue.loadUrl(URL); 
} 
} 

todo lo mejor ...

+0

Gracias por la respuesta. Conozco ** otras formas de hacerlo funcionar. Por ejemplo, agregar un 'WebViewClient' lo hace funcionar. Hacer que funcione no es mi problema. Descubrir por qué no está funcionando, es. –

+0

hey ur código funciona para mí .... – Richa

+0

¿Qué código? ¿Tuyo o mio? –

0

No, no del todo, pero te permite hacer muchas cosas.

Tenga en cuenta que realizar una llamada a shouldOverrideUrlLoading en WebViewClient tampoco parece funcionar, por lo que debe hacer su procesamiento en onPageFinished.

Aquí hay un blog post que lo guiará a través de.

0

Para cargar una página web desde la URL en una vista web, no es necesario configurar el cliente de vista web. Sin el cliente de vista web, puede cargar una página web en su vista web. Pero WebViewClient ofrece muchas ventajas para manejar la vista web. ejemplos de uso de la página web de carga de URL,


webView.loadUrl(yoururl); 
0

La única razón por la que se abre la URL en el navegador por defecto de Android es debido a la "wv.loadUrl (" http://www.google.com ");"

Cuando carga http://www.google.com, el sitio web de google realmente redirige la página a http://www.google.co.in (suponiendo que está iniciando la aplicación desde India).

Si ejecuta "wv.loadUrl (" http://www.google.co.in ");", google no redirigirá la página y se abrirá la primera página en su aplicación y se abrirán más clics en el navegador del sistema.

Para manejar estos clics adicionales necesita el WebViewClient.

Cuestiones relacionadas