web-dev-qa-db-fra.com

Ouverture de la vue Web pas dans le nouveau navigateur

J'implémente une vue Web. Je veux deux boutons en haut de la page Web.

J'ai une disposition linéaire verticale, à l'intérieur de laquelle se trouve une disposition horizontale avec deux boutons et une vue Web en dehors de la disposition horizontale.

Je charge simplement l'URL de Google dans Java code.

Chaque fois que je lance l'application, un nouveau navigateur s'ouvre au-dessus de l'application et les boutons sont masqués. Il ne montre pas les boutons au-dessus de la vue Web. Aidez-moi et dites-moi comment puis-je charger une URL dans la vue Web sans ouvrir un autre navigateur, ou comment je peux l'empêcher en ouvrant un navigateur natif, afin que la page soit chargée dans la vue Web elle-même et non dans un nouveau navigateur.

Merci a tous

19
WISH

La mise en page devrait ressembler à ceci:

<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
                 Android:layout_height="fill_parent"
                 Android:layout_width="fill_parent"
                 Android:orientation="vertical">
        <LinearLayout
            Android:orientation="horizontal"
            Android:layout_width="fill_parent"
            Android:layout_height="wrap_content">
            <Button Android:id="@+id/button1"
                Android:layout_width="0dip"
                Android:layout_height="wrap_content"                
                Android:layout_gravity="top"
                Android:layout_weight="1"/>
            <Button Android:id="@+id/button2"
                Android:layout_width="0dip"
                Android:layout_height="wrap_content"                
                Android:layout_gravity="top"
                Android:layout_weight="1" />
        </LinearLayout>
        <WebView 
            Android:id="@+id/webview"
            Android:layout_width="fill_parent"
            Android:layout_height="fill_parent"/>
</LinearLayout>

Et vous pouvez également vous référer à Besoin d'aide pour passer du stock Android navigateur à la vue Web pour voir si vous lancez l'url correctement.

3
rajath

Ouais. Vous devez implémenter la classe WebViewClient et la méthode OverrideshouldOverrideURLLoading() dans cette classe.

Pourquoi ? Parce que webview ouvrez simplement votre "lien exact", si ce lien redirige d'autres liens, Android ouvrira le navigateur par défaut pour cette action.

Dans votre exemple, comme vous le savez, lorsque vous vous connectez à google.com google redirigera vers google dans votre pays. Par exemple, si vous êtes en Chine, google ira à google.com.cn, si au Vietnam, sera google.com.vn.

Voici mon exemple simple: (vous pouvez imaginer que c'est un nouveau navigateur,: rire)

Le premier est le fichier xml de mise en page:

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

    <LinearLayout
        Android:layout_height="wrap_content"
        Android:layout_width="wrap_content">

        <EditText 
            Android:id="@+id/url"
            Android:layout_height="wrap_content"
            Android:layout_width="fill_parent"
            Android:layout_weight="1"
            Android:hint="Input URL"/>

        <Button 
            Android:id="@+id/run"
            Android:layout_height="wrap_content"
            Android:layout_width="wrap_content"
            Android:layout_weight="0"
            Android:text="GO"/>

    </LinearLayout>

    <WebView 
        Android:id="@+id/webview"
        Android:layout_height="fill_parent"
        Android:layout_width="fill_parent"/>

</LinearLayout>

Voici le code de l'activité principale:

package com.basic;

import Android.app.Activity;
import Android.os.Bundle;
import Android.view.View;
import Android.view.View.OnClickListener;
import Android.webkit.WebSettings;
import Android.webkit.WebView;
import Android.webkit.WebViewClient;
import Android.widget.Button;
import Android.widget.EditText;

public class WebViewExample extends Activity{ 

    WebView webView;

    @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.webview);

        webView = (WebView) findViewById(R.id.webview);

        Button button = (Button) findViewById (R.id.run);
        button.setOnClickListener(new OnClickListener() {           
            @Override
            public void onClick(View v) {
                gotoPage();             
            }
        });

    }

    private void gotoPage(){

        EditText text = (EditText) findViewById(R.id.url);
        String url = text.getText().toString();

        WebSettings webSettings = webView.getSettings();
        webSettings.setBuiltInZoomControls(true);

        webView.setWebViewClient(new Callback());  //HERE IS THE MAIN CHANGE
        webView.loadUrl(url);

    }

    private class Callback extends WebViewClient{  //HERE IS THE MAIN CHANGE. 

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            return (false);
        }

    }

}

J'espère que cela vous aidera :)

47
hqt

L'ajout du code suivant avant loadUrl () résoudra ce problème,

wv.setWebViewClient(new WebViewClient() {
public boolean shouldOverrideUrlLoading(WebView view, String url) {
          view.loadUrl(url);
          return true;
           }}); 

Le shouldOverrideUrlLoading () de WebViewClient fait ce travail. Voici le document Android doc pour shouldOverrideUrlLoading,

Donnez à l'application hôte une chance de prendre le contrôle lorsqu'une nouvelle URL est sur le point d'être chargée dans la WebView actuelle. Si WebViewClient n'est pas fourni, WebView demandera par défaut à Activity Manager de choisir le gestionnaire approprié pour l'URL. Si WebViewClient est fourni, return true signifie que l'application hôte gère l'url, tandis que return false signifie que le WebView actuel gère l'url ...

http://developer.Android.com/reference/Android/webkit/WebViewClient.html#shouldOverrideUrlLoading%28Android.webkit.WebView,%20Java.lang.String%29

21
Sathesh

Mon implémentation XML:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
    xmlns:tools="http://schemas.Android.com/tools"
    xmlns:app="http://schemas.Android.com/apk/res-auto" Android:layout_width="match_parent"
    Android:layout_height="match_parent">

<WebView
    Android:background="@Android:color/transparent"
    Android:id="@+id/webView"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"></WebView>
</RelativeLayout>

Mon Java:

WebView webView;
public final String GlobalUrl = "http://slashdot.org/";

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.my_application_activity);

    webView = (WebView) findViewById(R.id.webView);
    loadWebViewLoad(webView);
}

private void loadWebViewLoad(WebView webview) {
    webview.getSettings().setJavaScriptEnabled(true);
    webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webview.getSettings().setSupportMultipleWindows(true);
    webview.setWebViewClient(new WebViewClient());
    webview.setWebChromeClient(new WebChromeClient());
    webview.loadUrl(GlobalUrl);
}

Et le résultat final est:

Example image

10
d.danailov

J'ai eu exactement le même problème et heureusement, après avoir navigué sur le Web pendant environ une heure, j'ai mélangé certaines des choses que j'ai trouvées et cela a fonctionné.

c'est le code:

WebView webView;
webView = ((WebView) rootView.findViewById(R.id.detail_area));
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl(mItem.link);

où "detail_area" était ma vue Web, rootView était mon élément sélectionné dans un "flux maître/détail", le lien était l'URL que je voulais ouvrir.

3
Idan Damri

J'ai essayé ça. son travail pour moi. il n'ouvre pas une nouvelle fenêtre. il ouvrira uniquement la page de visualisation Web. sa cachette pour un nouveau navigateur demandant la fenêtre ouverte ..

private WebView webView;
String strUrl="url" ;

webView = (WebView) findViewById(R.id.webView1);
webView.getSettings().setJavaScriptEnabled(true);
webView.loadUrl(strUrl);
webView.setWebViewClient(new WebViewClient());
2
harikrishnan

Ajoutez la ligne ci-dessous dans votre fichier xml qui ayant une vue Web

tools:context=".MyActivity" (nom de votre activité)

1
Dhasneem

Cela pourrait être un message tardif, mais cela pourrait aider d'autres développeurs ...

Vous devez définir setWebViewClient on webview avant de charger l'URL dessus comme ci-dessous,

webview.setWebViewClient(new WebViewClient() {
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        return false;
    }
});

Quelques informations sur le code ci-dessus, la documentation indique en termes littéraux comme ci-dessous la méthode shouldOverrideUrlLoading.

 * @param view The WebView that is initiating the callback.
 * @param request Object containing the details of the request.
 * @return {@code true} if the Host application wants to leave the current WebView
 *         and handle the url itself, otherwise return {@code false}.
 */
@Override
@SuppressWarnings("deprecation") // for invoking the old shouldOverrideUrlLoading.
@RequiresApi(21)
public boolean shouldOverrideUrlLoading(@NonNull WebView view,
        @NonNull WebResourceRequest request) {
    if (Build.VERSION.SDK_INT < 21) return false;
    return shouldOverrideUrlLoading(view, request.getUrl().toString());
}

Si vous voyez la documentation ci-dessus pour retour de la valeur, il est dit,

@return {@code true} if the Host application wants to leave the current WebView
  *and handle the url itself, otherwise return {@code false}.

Donc, il dit simplement, si vous retournez la méthode true de shouldOverrideUrlLoading, il demandera au navigateur par défaut de votre appareil de gérer la demande d'ouverture de l'URL et si vous retournez - false, votre URL sera chargée uniquement via la vue Web.

Vous pouvez maintenant charger votre URL dans la vue Web après cet appel setWebViewClient ou vous pouvez également charger votre URL dans la méthode shouldOverrideUrlLoading avant de renvoyer la valeur.

0
Abhishek Kumar