2017-12-26 11 views
1

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡI solved it ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡWebview back button(goback) doesn't work

// Marshmallow below 
@Override 
public boolean shouldOverrideUrlLoading(WebView view, String url) { 
    if (view.canGoBack()) { 
     view.loadUrl(url); 
     return true; 
    } 
    return false; 
} 


// Nougat above 
@TargetApi(Build.VERSION_CODES.N) 
@Override 
public boolean shouldOverrideUrlLoading(WebView view, WebResourceRequest request) { 

    if (request.isRedirect()){ 
     view.loadUrl(url); 
     return true; 
    } 
    return false; 
} 

ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ

The back button doesn't work suddenly, It works very well, I haven't any update the code.

If I pressed the back button, It should close when the page was home. But My code application is closed wherever, when I press the back button.

I think Back code (goBack, canGoBack) doesn't work properly.

Error code

E/ViewSystem: ViewRootImpl #2 Surface is not valid. 
E/File: fail readDirectory() errno=2 
W/DisplayListCanvas: DisplayListCanvas is started on unbinded RenderNode (without mOwningView) 
enter code here 

MainActivity.java

import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.webkit.WebView; 
import android.webkit.WebViewClient; 

public class MainActivity extends AppCompatActivity {

private WebView myWebView; 
public static final String INTENT_PROTOCOL_START = "intent:"; 
public static final String INTENT_PROTOCOL_INTENT = "#Intent;"; 
public static final String INTENT_PROTOCOL_END = ";end;"; 
public static final String GOOGLE_PLAY_STORE_PREFIX = "market://details?id="; 

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


    myWebView.setWebViewClient(new MyWebViewClient()); 
    myWebView.goBack(); 
    myWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); 
    myWebView.getSettings().setJavaScriptEnabled(true); 

    myWebView.loadUrl("http://fpfriends.com"); 
} 

private class MyWebViewClient extends WebViewClient{ 
    @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) && myWebView.canGoBack()) { 
     myWebView.goBack(); 
     return true; 
    } 

    return super.onKeyDown(keyCode, event); 
} 

// I tried below code too. 
@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (event.getAction() == KeyEvent.ACTION_DOWN) { 
     switch (keyCode) { 
      case KeyEvent.KEYCODE_BACK: 
       if (myWebView.canGoBack()) { 
        myWebView.goBack(); 
       } else { 
        finish(); 
       } 
       return true; 
     } 
    } 
    return super.onKeyDown(keyCode, event); // 
} 
} 
+0

Check this [link](http://www.androhub.com/android-advance-webview/). –

답변

0

just try calling onBackPressed

@Override 
public void onBackPressed() { 
    super.onBackPressed(); 
} 

or change your onKeyDown method like this

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 
    if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { 

     finish(); 
     return true; 
    } 
    return super.onKeyDown(keyCode, event); 
} 
0

you should do like this see below

@Override 
    public boolean onKeyDown(int keyCode, KeyEvent event) { 
     if ((keyCode == KeyEvent.KEYCODE_BACK)) { 
      if (myWebView.canGoBack())//test if your webview can go back more if not it will go to else 
       myWebView.goBack(); 
      else 
       finish(); 
      return true; 
     } 
     return super.onKeyDown(keyCode, event); 
    }