2015-12-04 3 views
0

Я новичок в разработке android, я попытался переопределить onBackPress() для реализации webView.GoBack(). Но при нажатии клавиши возврата мои приложения рушились. Вот мой код MainActivity.java. Я делаю что-то неправильно ??onBackPressed() отключает мое приложение для веб-просмотра

public class MainActivity extends AppCompatActivity { 

private WebView webview; 

    /** Called when the activity is first created. */ 

    public void onBackPressed(){ 

     if (webview.isFocused() && webview.canGoBack()) { 
       webview.goBack(); 
     } 
     else { 
       super.onBackPressed(); 

     } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     WebView view = (WebView) findViewById(R.id.webView); 

     view.getSettings().setJavaScriptEnabled(true); 

     view.setWebViewClient(new MyCustomWebViewClient()); 
     view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 


     view.loadUrl("http://url"); 


    } 



    private class MyCustomWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 

      view.loadUrl(url); 
      return true; 
     } 


     @Override 
     public void onPageFinished(WebView view, String url) { 
      //hide loading image 
      findViewById(R.id.imageLoading1).setVisibility(View.GONE); 
      //show webview 
      findViewById(R.id.webView).setVisibility(View.VISIBLE); 
     } 


     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      if (view.canGoBack()) { 
       view.goBack(); 
      } else { 
       view.loadUrl("file:///android_asset/index.html"); 
      } 
      Toast.makeText(getBaseContext(), description, Toast.LENGTH_LONG).show(); 
     } 

    } 


} 
+0

Но при нажатии клавиши возврата мои приложения падают. какое исключение вы получили от возвращения? –

+2

"crashed" означает, что в Logcat есть сообщение об ошибке, поэтому, пожалуйста, опубликуйте сообщение об ошибке – 0X0nosugar

+0

покажите нам выход logcat, пожалуйста! – AADProgramming

ответ

0

Просто потому, что ваш webView имеет значение null. Вы нигде не ссылаетесь на него. Изменен код.

public class MainActivity extends AppCompatActivity { 

private WebView view; 

    /** Called when the activity is first created. */ 

    public void onBackPressed(){ 

     if (view.isFocused() && view.canGoBack()) { 
      view.goBack(); 
     } 
     else { 
      super.onBackPressed(); 
     } 
    } 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     view = (WebView) findViewById(R.id.webView); 

     view.getSettings().setJavaScriptEnabled(true); 

     view.setWebViewClient(new MyCustomWebViewClient()); 
     view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 


     view.loadUrl("http://url"); 


    } 



    private class MyCustomWebViewClient extends WebViewClient { 
     @Override 
     public boolean shouldOverrideUrlLoading(WebView view, String url) { 

      view.loadUrl(url); 
      return true; 
     } 


     @Override 
     public void onPageFinished(WebView view, String url) { 
      //hide loading image 
      findViewById(R.id.imageLoading1).setVisibility(View.GONE); 
      //show webview 
      findViewById(R.id.webView).setVisibility(View.VISIBLE); 
     } 


     public void onReceivedError(WebView view, int errorCode, String description, String failingUrl) { 
      if (view.canGoBack()) { 
       view.goBack(); 
      } else { 
       view.loadUrl("file:///android_asset/index.html"); 
      } 
      Toast.makeText(getBaseContext(), description, Toast.LENGTH_LONG).show(); 
     } 

    } 
} 
+0

Huh! мой плохой, я этого не заметил. Большое спасибо. –

0

В onCreate у вас есть:

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

WebView вы определили на вершине не был инициализирован, и это один используется методом onBackPressed, чтобы исправить это все, что вам нужно сделать это удалить WebView перед инициализацией переменной в onCreate:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    view = (WebView) findViewById(R.id.webView); 

    view.getSettings().setJavaScriptEnabled(true); 

    view.setWebViewClient(new MyCustomWebViewClient()); 
    view.setScrollBarStyle(View.SCROLLBARS_INSIDE_OVERLAY); 


    view.loadUrl("http://url"); 


} 
+0

Спасибо тонну 4warded, я новичок в SO и не имею достаточной репутации для продвижения. : D –

+0

Нет проблем, принятый ответ в значительной степени совпадает с тем, что я написал, но я включил более подробную информацию о том, какова была настоящая проблема. Кроме того, вы все равно можете повышать, но они показывают только тогда, когда вы получаете достаточную репутацию: P – Forb

0

на самом деле вы не можете сделать прямо внутри фрагмент. OnBackPressed можно переопределить в FragmentActivity. Что вы можете сделать, это:

1.Override the onBackPressed inside the activity. 
2.When the onBackPressed is called, check if the instance of the current fragment is the instance showing the webview. 
3.If it is, ask the fragment if the webview can go back. 
4.If it is not, call the super or whatever you need 

@Override 
public void onBackPressed() { 
    Fragment webview = getSupportFragmentManager().findFragmentByTag("webview"); 
    if (webview instanceof MyWebViewFragment) { 
      boolean goback = ((MyWebViewFragment)webview).canGoBack(); 
      if (!goback) 
      super.onBackPressed(); 
    } 
} 
Смежные вопросы