2014-12-30 2 views
0

Итак, я работал над приложением в Android Studio для школы. У меня есть веб-просмотр внутри фрагмента. Но в приложении, когда я открываю фрагмент на своем телефоне, приложение падает, и мой телефон говорит: «К сожалению, приложение LARKer остановлено».Webview in Fragment вызывает сбой

Вот класс Fragment:

import android.content.Intent; 
import android.net.Uri; 
import android.support.v4.app.Fragment; 
import android.os.Bundle; 
import android.support.annotation.Nullable; 
import android.view.KeyEvent; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.webkit.WebSettings; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

/** 
* Created by Andrew on 12/29/2014. 
*/ 
public class menu4_Fragment extends Fragment { 
    private WebView mWebView; 

    View rootview; 
    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     rootview = inflater.inflate(R.layout.menu4_layout,container,false); 

     mWebView = (WebView) getView().findViewById(R.id.webView); 
     WebSettings webSettings = mWebView.getSettings(); 
     webSettings.setJavaScriptEnabled(true); 
     mWebView.loadUrl("foo"); 
     mWebView.setWebViewClient(new MyWebViewClient()); 

     return rootview; 
} 

    public class MyWebViewClient extends WebViewClient { 

     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 
      if(Uri.parse(url).getHost().contentEquals("foo")) { 
       // This is my website, so do not override; ler my WebView load the page 

       return false; 
      } 

      //Otherwise, the link is not for a page on my site, so launch another Activity that handles URLs 
      Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url)); 
      startActivity(intent); 
      return true; 
     } 
    } 
} 

И вот XML:

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

    <TextView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:textAppearance="?android:attr/textAppearanceLarge" 
     android:text="LARK: Login" 
     android:id="@+id/textView" 
     android:layout_alignParentTop="true" 
     android:layout_centerHorizontal="true" 
     android:layout_marginTop="35dp" 
     android:textSize="50dp" /> 

    <WebView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/webView" 
     android:layout_below="@+id/textView" 
     android:layout_alignParentBottom="true" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentEnd="true" /> 

</RelativeLayout> 

Вот образ того, что я получил на свой телефон: screenshot

+0

Вы можете разместить свой logcat –

ответ

2

Изменить этот код

mWebView = (WebView) getView().findViewById(R.id.webView); 

Подобно этому, он будет работать

mWebView = (WebView) rootview.findViewById(R.id.webView); 

Вы должны получить вид с вашего View Group.otherwise будет возвращать ошибку.

0

изменить это на oncreateview() Methed вашего fragmanet

mWebView = (WebView) rootview.findViewById(R.id.webView); 
0

Попробуйте этот код,

WebView webViewInfo = (WebView) findViewById(R.id.webview); 
    webViewInfo.getSettings().setJavaScriptEnabled(true); 
    webViewInfo.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    webViewInfo.setWebViewClient(new MYWEBCLIENT()); 
    webViewInfo.loadData("LOAD_YOUR_URL", "text/html", "UTF-8"); 

И класс WebViewClient реализовать на WebView метода.

private class MYWEBCLIENT extends WebViewClient { 

    @Override 
    public void onPageStarted(WebView view, String url, Bitmap favicon) { 
     super.onPageStarted(view, url, favicon); 
    } 

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

На клавиатуре задней ручки,

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if ((keyCode == KeyEvent.KEYCODE_BACK) && webViewInfo.canGoBack()) { 
     webViewInfo.goBack(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 

Я надеюсь, что этот код помощь для вас ... !!

+0

Пожалуйста, не вызывайте loadUrl на URL-адрес, который вы получаете из 'shouldOverrideUrlLoading', поскольку этот обратный вызов также вызывается для подкадров с не-https-схемами. Если вы перейдете на страницу, похожую на http://jsbin.com/gupug/1/quiet, ваш код в конечном итоге вызовет view.loadUrl ('tel: 1234'), и вы в конечном итоге покажете страницу с ошибкой, так как webview doesn Не знаете, как загрузить tel: URL. Вместо того, чтобы вызывать loadUrl (url) и возвращать true, вы должны просто вернуть false из shouldOverrideUrlLoading. –