android webView 当用loadDataWithBaseURL加载本地html时如何实现后退到上一页面

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android webView 当用loadDataWithBaseURL加载本地html时如何实现后退到上一页面相关的知识,希望对你有一定的参考价值。

简单来说就是加载A页面后点击里面的链接跳转到B页面(B也为本地页面),这时想通过点击返回键退回到A页面,之前试过canGoBack()发现在loadDataWithBaseURL中无法实现,请高手赐教

LZ你好
之所以不能返回是因为返回键的时候系统当做整个activity,而不是webview的历史页面
也就是说你必须消费掉back事件。
你可以覆盖activity中的方法
public boolean onKeyDown(int keyCode, KeyEvent event)
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
mWebView.goBack();
return true;

return super.onKeyDown(keyCode, event);

这样就行,另外再提醒一点,如果在webview中点连接,默认的是会调用系统的浏览器
所以还需
mWebView.setWebViewClient(new WebViewClient()
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;

);
这样就能保证在webview中跳转追问

你的这个方法我之前就试过了,我目前的情况是我在A页面调用loadUrl加载网络地址,然后再在B页面用loadDataWithBaseURL加载本地html时无法跳转上一页面,B页面的mWebView.canGoBack()的返回值为false,也就是说并没有真正意义上的A到B,我试过A和B的getUrl()都是同一个路径,并且路径是loadUrl时的网络地址

追答

A页面加载网络地址?那么B页面不是网络地址了吗?再在B页面调用本地页面?抱歉LZ,没太明白你的意思。

追问

之前的标题字数有限制,没有说明完整实在不好意思,是的,两次加载的第一次加载的是网络地址(http://)第二次加载的是本地SD卡中指定的html(file:///)

追答

我想问的是,如果第一次加载网络地址,那么不是跳转到网络页面,然后loadDataWithBaseURL加载本地页面(就是APK asserts文件夹下的页面),请问是如何在网络页面触发什么事件或者监听什么事件才实现加载本地页面,如果是webview以外的事件而不是webview内的事件,又怎会有历史记录?又怎么可以返回?除非只能重定向。

追问

我是用的PhoneGap通过web页面传递过来的js触发的加载本地页面

追答

哦,你用的是框架,这个框架没详细了解过,不过按照你所说的情况是监听JS事件然后触发加载本地页面,监听的事件只是用来再次触发java中loadDataWithBaseURL连接页面的响应,应该不属于webview内自己定向,而是外部重定向(应该没历史记录可言),所以我觉得就是这个问题。(暂时不知道如何解决)
如果LZ做到了,希望能告诉我一下,谢了。

参考技术A 不能返回是因为返回键的时候系统当做整个activity,而不是webview的历史页面
也就是说你必须消费掉back事件。
你可以覆盖activity中的方法
public boolean onKeyDown(int keyCode, KeyEvent event)
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
mWebView.goBack();
return true;

return super.onKeyDown(keyCode, event);

这样就行,另外再提醒一点,如果在webview中点连接,默认的是会调用系统的浏览器
所以还需
mWebView.setWebViewClient(new WebViewClient()
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;

);
这样就能保证在webview中跳转
参考技术B LZ你好
之所以不能返回是因为返回键的时候系统当做整个activity,而不是webview的历史页面
也就是说你必须消费掉back事件。
你可以覆盖activity中的方法
public boolean onKeyDown(int keyCode, KeyEvent event)
if ((keyCode == KeyEvent.KEYCODE_BACK) && mWebView.canGoBack())
mWebView.goBack();
return true;

return super.onKeyDown(keyCode, event);

这样就行,另外再提醒一点,如果在webview中点连接,默认的是会调用系统的浏览器
所以还需
mWebView.setWebViewClient(new WebViewClient()
public boolean shouldOverrideUrlLoading(WebView view, String url)
view.loadUrl(url);
return true;

);
这样就能保证在webview中跳转
参考技术C 这个技术好像还没人可以实现吧!!!! 参考技术D 采纳我,再告诉你

由于默认浏览器,Android 无法在 web 视图中实现 facebook 评论

【中文标题】由于默认浏览器,Android 无法在 web 视图中实现 facebook 评论【英文标题】:Android unable to implement facebook comment in a webview due to default browser 【发布时间】:2012-01-24 12:38:19 【问题描述】:

我是 Android 开发的新手,这个 webview 和 webview 客户端正在杀死我。这是我的场景:

    我必须加载一个包含 facebook 社交插件(用于评论该特定 url)的网页,并且我正在使用 WebView 当用户使用 Facebook 点击评论时,他/她将在同一个 webview 上获得登录页面(而不是打开默认浏览器) 一旦登录成功,将显示第一页(包含社交插件的页面),允许用户发表评论

我要做的是模拟浏览器的工作过程,即用户登录时,他/她会自动获得添加facebook评论的权限。

我的问题:

我不知道如何从浏览器获取所有身份验证并将其重定向回我的应用程序 web 视图。我想要的是在我的应用程序 webview 中完成所有过程,而不是使用默认浏览器。

我检查了所有堆栈溢出问题,其中大多数建议使用 Facebook 连接和 Facebook android SDK 等开源 Facebook 插件。此外,我得到了一些关于CookieManagerCookieSyncManagerWebViewClientWebChromeClient 的信息,但我无法解决我的问题。我找到的最接近的是:

How to handle facebook like with confirm in android webview

各位,如果你们能指出我正确的方向,我会非常高兴。我仍在尝试了解如何在 webview 上进行所有操作,如果有任何事情发生,我一定会发布。

提前致谢

更新

我只能实现facebook登录,但无法实现AOLHotmailYahoo登录。对于 facebook 登录只需创建一个自定义 WebViewClient 和方法 shouldOverrideUrlLoading

if(url.contains("https://www.facebook.com/connect/window_comm.php"))
    webView.clearHistory();
    webView.loadUrl(remoteUrl);

return false;

为了允许多次登录,我实现了以下技术,但它不起作用

 if(url.contains("https://www.facebook.com/connect/window_comm.php"))
    String cookieString = cookieManager.getCookie("facebook.com");
    if(cookieString != null)
      cookieManager.setCookie("remoteUrldomain.com", cookieString);
      CookieSyncManager.getInstance().sync();
      webView.clearHistory();
      webView.loadUrl(remoteUrl);
    

return false;

我仍在尽我所能找到解决方案,任何人都会在正确的方向指导我,我将不胜感激。 在此先感谢

【问题讨论】:

【参考方案1】:

提供的答案 How to handle facebook like with confirm in android webview 是迄今为止我找到的最好的解决方案。我了解到的是 Android WebView 默认情况下不会加载 html 视图的弹出窗口,为此我们需要使用处理所有这些的 WebChromeClient。看看以下代码

 private String requestUrl="some web link containing facebook social comment";
 private WebView webView,childView =null;
 private LinearLayout parentLayout;
 private Activity MyActivity;
 @Override
 public void onCreate(Bundle savedInstanceState)
    super.onCreate(savedInstanceState);
    this.getWindow().requestFeature(Window.FEATURE_PROGRESS);

    setContentView(R.layout.main);

    getWindow().setFeatureInt(Window.FEATURE_PROGRESS,Window.PROGRESS_VISIBILITY_ON);
    parentLayout =(LinearLayout)findViewById(R.id.parentLayout);


    MyActivity = this;


    webView = new WebView(this);
    webView.setLayoutParams(getLayoutParams());

    webView.setWebViewClient(new FaceBookClient());
    webView.setWebChromeClient(new MyChromeClient());
    webView.getSettings().setJavaScriptEnabled(true);
    webView.getSettings().setAppCacheEnabled(true);
    webView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);
    webView.getSettings().setSupportMultipleWindows(true);
    webView.getSettings().setSupportZoom(true);
    webView.getSettings().setBuiltInZoomControls(true);

    parentLayout.addView(webView);
    webView.loadUrl(requestUrl);

 

  private LinearLayout.LayoutParams getLayoutParams()
    return new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT); 



    final class MyChromeClient extends WebChromeClient
    @Override
    public boolean onCreateWindow(WebView view, boolean dialog,
            boolean userGesture, Message resultMsg) 
        childView = new WebView(SmCommentTestActivity.this);
        childView.getSettings().setJavaScriptEnabled(true);
        childView.getSettings().setSupportZoom(true);
        childView.getSettings().setBuiltInZoomControls(true);
        childView.setWebViewClient(new FaceBookClient());
        childView.setWebChromeClient(this);
        childView.setLayoutParams(new LinearLayout.LayoutParams(LayoutParams.FILL_PARENT,LayoutParams.FILL_PARENT));


        parentLayout.addView(childView);


        childView.requestFocus();
        webView.setVisibility(View.GONE);

          /*I think this is the main part which handles all the log in session*/
        WebView.WebViewTransport transport =(WebView.WebViewTransport)resultMsg.obj;
        transport.setWebView(childView);
        resultMsg.sendToTarget();
        return true;
    


    @Override
    public void onProgressChanged(WebView view, int newProgress) 
        MyActivity.setProgress(newProgress*100);
    

    @Override
    public void onCloseWindow(WebView window) 
        parentLayout.removeViewAt(parentLayout.getChildCount()-1);
        childView =null;
        webView.setVisibility(View.VISIBLE);
        webView.requestFocus();
    


    private class FaceBookClient extends WebViewClient
     @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) 
        Log.i("REQUEST URL",url);
        return false;
       


    @Override
    public void onBackPressed() 
    if(childView != null && parentLayout.getChildCount()==2)
        childView.stopLoading();
        parentLayout.removeViewAt(parentLayout.getChildCount()-1);
        if(webView.getVisibility() == View.GONE)
            webView.setVisibility(View.VISIBLE);
    else          
        super.onBackPressed();
    

这就是在Android WebView 上实现Facebook Social Comment Plugin 所要做的全部事情,如果有人发现其中有任何缺陷,那么我很乐意纠正它。希望这个解决方案能为任何陷入困境的开发人员节省时间和时间像我一样;)

【讨论】:

我需要安装任何jar到lib文件夹吗? 登录后一直刷新页面。 @Minion 你有没有解决登录后刷新问题的方法?我面临与上述代码相同的问题。如果您对此有任何解决方案,请帮助我。 @jaydroider 关注本文androidhive.info/2016/09/…

以上是关于android webView 当用loadDataWithBaseURL加载本地html时如何实现后退到上一页面的主要内容,如果未能解决你的问题,请参考以下文章

Android WebView

android 开发webview如何加载p标签的html

android webview

android webview-android的webview怎么修改网页字体颜色和背景

android中webview 怎么实现网页加载时显示加载进度?

android中webview 怎么实现网页加载时显示加载进度