Android Webview lance un navigateur lors de l'appel de Loadurl


473

J'ai créé un Activityqui a un titre et une vue Web dans un fichier LinearLayout. Dans la onResume()méthode qu'elle appelle webView.loadUrl(url). Le problème est que l'activité affiche d'abord le titre avec le reste de l'écran vide, puis le navigateur de l'appareil est lancé avec la page de l'URL. Ce que je veux voir, c'est la page affichée WebViewsous le titre. Quel pourrait être le problème?

Edit : Ok, j'ai fait d'autres recherches et trouvé celui-ci:

Cliquer sur les URL ouvre le navigateur par défaut

Il pointe vers le WebViewtutoriel ici .

Implémentez simplement le client Web et définissez-le.


Je mentionne cela parce que vous avez résolu mon problème ... Merci.
Jesse Black

2
@Ray, envisagez d'écrire une réponse à cette question, si vous avez trouvé une solution, et acceptez-la. Cela aidera d'autres personnes ayant le même problème.
HitOdessit

1
J'ai eu un problème encore plus méchant. Il s'avère que même une redirection se chargera avec le navigateur si aucun WebViewClient personnalisé n'est utilisé.
Jakob Weisblat


Celui-ci en parle aussi ... youtube.com/watch?v=4bIF5In1c8s
Athira Reddy

Réponses:


799

Répondre à ma question sur la base des suggestions de Maudicus et Hit.

Consultez le didacticiel WebView ici . Implémentez simplement le client Web et définissez-le avant loadUrl . La manière la plus simple est:

myWebView.setWebViewClient(new WebViewClient());

Pour un traitement plus avancé du contenu Web, pensez à ChromeClient.


3
Pour éviter que WebView ne lance le navigateur par défaut lors de l'ouverture de la page initiale.
Magno C

23
Merci pour cet incroyable petit morceau de sorcellerie! +1 ... MOINS UN POUR VOUS, Android ...
Josh

Excellente réponse. A résolu mon problème aussi.
Omid1989

Est-ce que cela ne fonctionne que pour le chargement initial? Et si vous souhaitez naviguer dans le navigateur depuis l'application?
logicbloke

5
myWebView.webViewClient = WebViewClient()à Kotlin!
Thomas Pritchard

98

Utilisez ceci:

lWebView.setWebViewClient(new WebViewClient());

@DigvijaySingh vérifie l'original de la réponse acceptée. À l'origine, il n'avait pas ce code. Il a été ajouté bien après cette réponse
Vladyslav Matviienko

52

utiliser comme ceci:

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

    WebView myWebView = (WebView) findViewById(R.id.webView1);
    myWebView.setWebViewClient(new WebViewClient());
    myWebView.loadUrl("https://google.com");
}

25

Faites votre activité comme ça.

public class MainActivity extends Activity {
WebView browser;

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

    // find the WebView by name in the main.xml of step 2
    browser=(WebView)findViewById(R.id.wvwMain);

    // Enable javascript
    browser.getSettings().setJavaScriptEnabled(true);  

    // Set WebView client
    browser.setWebChromeClient(new WebChromeClient());

    browser.setWebViewClient(new WebViewClient() {

        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
                view.loadUrl(url);
                return true;
                }
        });
     // Load the webpage
    browser.loadUrl("http://google.com/");
   }
}

1
setJavaScriptEnabled(true)introduit des vulnérabilités XSS dans votre application. Ne l'utilisez pas si vous n'avez pas besoin de JavaScript
apex39

La ligne activant JavaScript est super importante, sinon vous obtiendrez You need to enable JavaScript to run this app.et googler ne révélera que les personnes ayant des problèmes avec réagir natif et vous deviendrez fou parce que JavaScript est déjà activé dans les paramètres du navigateur.
Jordan H

19

J'étais confronté au même problème et j'ai trouvé la solution Documentation officielle d'Android sur WebView

Voici ma onCreateView()méthode et ici j'ai utilisé deux méthodes pour ouvrir les URL La

méthode 1 ouvre l'URL dans le navigateur et la

méthode 2 ouvre l'URL dans la vue Web souhaitée.
Et j'utilise la méthode 2 pour mon application et voici mon code:

public class MainActivity extends Activity {
   private WebView myWebView;

     @Override
     public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

      View rootView = inflater.inflate(R.layout.fragment_webpage_detail, container, false);

      // Show the dummy content as text in a TextView.
      if (mItem != null) {

         /* Method : 1
          This following line is working fine BUT when we click the menu item then it opens the URL in BROWSER not in WebView */
         //((WebView)   rootView.findViewById(R.id.detail_area)).loadUrl(mItem.url);

        // Method : 2
        myWebView = (WebView) rootView.findViewById(R.id.detail_area); // get your WebView form your xml file
        myWebView.setWebViewClient(new WebViewClient()); // set the WebViewClient
        myWebView.loadUrl(mItem.url); // Load your desired url
    }

    return rootView;
}                                                                                               }

6

Répondez simplement, vous pouvez utiliser comme ceci

public class MainActivity extends AppCompatActivity {

     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         WebView webView = new WebView(this);
         setContentView(webView);
         webView.setWebViewClient(new WebViewClient());
         webView.loadUrl("http://www.google.com");
   }
}

6

Essayez ce code ...

private void startWebView(String url) {

    //Create new webview Client to show progress dialog
    //When opening a url or click on link

    webView.setWebViewClient(new WebViewClient() {      
        ProgressDialog progressDialog;

        //If you will not use this method url links are opeen in new brower not in webview
        public boolean shouldOverrideUrlLoading(WebView view, String url) {              
            view.loadUrl(url);
            return true;
        }

        //Show loader on url load
        public void onLoadResource (final WebView view, String url) {
            if (progressDialog == null) {
                // in standard case YourActivity.this
                progressDialog = new ProgressDialog(view.getContext());
                progressDialog.setMessage("Loading...");
                progressDialog.show();
            }
        }
        public void onPageFinished(WebView view, String url) {
            try{
            if (progressDialog.isShowing()) {
                progressDialog.dismiss();
                progressDialog = null;
            }
            }catch(Exception exception){
                exception.printStackTrace();
            }
        }

    }); 

     // Javascript inabled on webview  
    webView.getSettings().setJavaScriptEnabled(true); 

    // Other webview options
    /*
    webView.getSettings().setLoadWithOverviewMode(true);
    webView.getSettings().setUseWideViewPort(true);
    webView.setScrollBarStyle(WebView.SCROLLBARS_OUTSIDE_OVERLAY);
    webView.setScrollbarFadingEnabled(false);
    webView.getSettings().setBuiltInZoomControls(true);
    */

    /*
     String summary = "<html><body>You scored <b>192</b> points.</body></html>";
     webview.loadData(summary, "text/html", null); 
     */

    //Load url in webview
    webView.loadUrl(url);
}

1

Si vous voyez une page vide , activez JavaScript.

webView.setWebViewClient(new WebViewClient());
WebSettings webSettings = webView.getSettings();
webSettings.setJavaScriptEnabled(true);
webSettings.setDomStorageEnabled(true);
webView.loadUrl(url);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.