2015-12-10 2 views
0

Im новый здесь, чтобы вы все знали.Webview не вернется (Xamarin - Android C#)

Я начал создавать приложение для веб-браузера для андроида, и я хотел разрешить пользователю вернуться на предыдущую страницу вместо того, чтобы alwasy выйти из приложения.

Я получаю эту ошибку во время выполнения, когда запускаю приложение, и нажимаю значок назад.

"System.NullReferenceException: Ссылка на объект не указывает на экземпляр объекта"

Its для этого блока кода:

public override bool OnKeyDown(Keycode keyCode, KeyEvent e) 
{ 
if (keyCode == Keycode.Back && web_view.CanGoBack()) // <-- this is the line which brings up the error 
{ 
web_view.GoBack(); 

      return true; 
    } 

      return base.OnKeyDown(keyCode, e); 
} 

Я подозреваю, его что-то делать с WebView.

Может ли кто-нибудь дать мне несколько советов о том, как действовать?

Ниже мой исходный код моего маленького проекта:

using System; 
using Android.App; 
using Android.OS; 
using Android.Webkit; 
using Android.Views; 

namespace MyWebApp 
{ 
[Activity(Label = "MyWebApp", MainLauncher = true, Icon = "@drawable/icon", Theme = "@android:style/Theme.NoTitleBar")] 
public class MainActivity : Activity 
{ 
WebView web_view; //<-- I think this might be the issue? 

    protected override void OnCreate(Bundle bundle) 
    { 
     base.OnCreate(bundle); 

     // Set our view from the "main" layout resource 
     SetContentView(Resource.Layout.Main); 

     DisplayWebpage(web_view, "http.google.com"); 
    } 


    private WebView DisplayWebpage(WebView webview, String url) 
    { 
     webview = FindViewById<WebView>(Resource.Id.webView); 

     webview.Settings.JavaScriptEnabled = true; 
     webview.LoadUrl(url); 

     webview.SetWebViewClient(new WebView_Client()); 

     return webview; 
    } 


    public class WebView_Client : WebViewClient 
    { 
     public override bool ShouldOverrideUrlLoading(WebView view, string url) 
     { 
      view.LoadUrl(url); 

      return true; 
     } 
    } 


    // BACK FUNCTIONALITY 
    public override bool OnKeyDown(Keycode keyCode, KeyEvent e) 
    { 
     if (keyCode == Keycode.Back && web_view.CanGoBack()) 
     { 
      web_view.GoBack(); 

      return true; 
     } 

     return base.OnKeyDown(keyCode, e); 
    } 
} 
} 

ответ

1

Вы не назначая свой WebView экземпляр (web_view) в возврате вашего DisplayWebpage метода:

web_view = DisplayWebpage(web_view, "http.google.com"); 

Тогда вы должны быть в состоянии:

public override bool OnKeyDown(Keycode keyCode, KeyEvent e) 
{ 
    if (keyCode == Keycode.Back && web_view != null) { 
     try { 
      if (web_view.CanGoBack()) { 
       Log.Debug ("StackOverflow", "Allow browser back"); 
       Toast.MakeText (this, "Allow browser back", ToastLength.Short).Show(); 
       web_view.GoBack(); 
       return true; 
      } 
     } 
     catch (Exception ex) { 
      Log.Error ("StackOverflow", ex.Message); 
     } 
    } else { 
     Log.Error ("StackOverflow", "Null webview..."); 
    } 
    Log.Debug ("StackOverflow", "Back button blocked"); 
    Toast.MakeText (this, "Back button blocked", ToastLength.Short).Show(); 
    return false; 
} 
+0

Это сработало! Спасибо всем. – Duggan

0
web_view.GoBack(); 

Я думаю, ваша проблема только здесь, вы используете его, прежде чем поставить свою ценность внутри или перед тем как сделать новый(). Если вы хотите сохранить свой старый веб-просмотр в web_view. Вы должны сделать что-то вроде web_view = webview где-то раньше. Затем сделайте web_view.GoBack()

Смежные вопросы