【问题标题】:Back Button Android WebView返回按钮 Android WebView
【发布时间】:2016-06-10 08:14:04
【问题描述】:

首先,我对 Java 一无所知。我从事前端开发工作,仅此而已,我尝试过查看文档和教程,但遇到了问题。我有一个网站,我是试图让它在Android上运行。除了在 Android 设备上按下退出应用程序之外,我几乎可以正常工作(这是我所阅读的内容)

@Override
        public void onBackPressed() {
            if (WebView.canGoBack()) {
                WebView.goBack();
            } else {
                super.onBackPressed();
            }
        }            

是我尝试添加到我的代码中,但是我得到了错误:

Error:(45, 24) error: non-static method canGoBack() cannot be referenced from a static context

Error:(46, 24) error: non-static method goBack() cannot be referenced from a static context

Error:(48, 22) error: cannot find symbol method onBackPressed()

Error:(43, 9) error: method does not override or implement a method from a supertype

提前非常感谢!

P.S - 这是完整的代码。

package com.appname.appname;

import android.app.Activity;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.webkit.WebSettings;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import android.view.KeyEvent;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    WebView myWebView = (WebView) findViewById(R.id.myWebView);
    myWebView.loadUrl("http://www.website.com");
    myWebView.setWebViewClient(new MyWebViewClient());

    //Settings
    WebSettings webSettings = myWebView.getSettings();
    webSettings.setJavaScriptEnabled(true);

}

private class MyWebViewClient extends WebViewClient {

    //Open links internally
    @Override
    public boolean shouldOverrideUrlLoading(WebView view, String url) {
        if (Uri.parse(url).getHost().equals("www.website.com")) {
            return false;
        }
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
        startActivity(intent);
        return true;
    }

    //Back Button Fix

    @Override
    public void onBackPressed() {
        if (WebView.canGoBack()) {
            WebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
  }
}

谢谢。

编辑:我也尝试过在另一个 Stack 帖子中找到的代码。

@Override
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        if (event.getAction() == KeyEvent.ACTION_DOWN) {
            switch (keyCode) {
                case KeyEvent.KEYCODE_BACK:
                    if (WebView.canGoBack()) {
                        WebView.goBack();
                    } else {
                        finish();
                    }
                    return true;
            }

        }
        return super.onKeyDown(keyCode, event);
    }

我在教程中被告知按 ctrl+o(在 Android Studio 中)并为 onKeyDown 选择 Override,但这不在我的列表中。然后我发现 onKeyDown 是针对 2.0 之前的手机的?所以我尝试寻找 onBackPressed 但我也找不到。我知道这将是一件非常容易的事情..

【问题讨论】:

标签: java android


【解决方案1】:

尝试改变:

@Override
public void onBackPressed()
{
    if(WebView.canGoBack()){
        WebView.goBack();
    }else{
        super.onBackPressed();
    }
}

到:

@Override
public void onBackPressed()
{
    WebView webView = (WebView) findViewById(R.id.webView1);
    if(webView.canGoBack()){
        webView.goBack();
    }else{
        super.onBackPressed();
    }
}

解释: 您应该为您正在使用的 web 视图 instance 调用 canGoBack() 和 goBack()(移至上一个视图)。这也是为什么方法在实例级别而不是在类级别(静态)声明的原因

更新:

声明全局

 WebView myWebView;


 this.myWebView = (WebView) findViewById(R.id.myWebView);

  @Override
    public void onBackPressed()
    {
        if(myWebView.canGoBack()){
            myWebView.goBack();
        }else{
            super.onBackPressed();
        }
    }

完整代码:

 package com.appname.appname;

    import android.app.Activity;
    import android.content.Intent;
    import android.net.Uri;
    import android.os.Bundle;
    import android.webkit.WebSettings;
    import android.webkit.WebView;
    import android.webkit.WebViewClient;
    import android.view.KeyEvent;

    public class MainActivity extends Activity {

       WebView myWebView;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        this.myWebView = (WebView) findViewById(R.id.myWebView);
        myWebView.loadUrl("http://www.website.com");
        myWebView.setWebViewClient(new MyWebViewClient());

        //Settings
        WebSettings webSettings = myWebView.getSettings();
        webSettings.setJavaScriptEnabled(true);

    }

    private class MyWebViewClient extends WebViewClient {

        //Open links internally
        @Override
        public boolean shouldOverrideUrlLoading(WebView view, String url) {
            if (Uri.parse(url).getHost().equals("www.website.com")) {
                return false;
            }
            Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));
            startActivity(intent);
            return true;
        }

      }


        //Back Button Fix

        @Override
        public void onBackPressed() {
            if (myWebView.canGoBack()) {
                myWebView.goBack();
            } else {
                super.onBackPressed();
            }
        }
    }

【讨论】:

  • @JesseWalby 查看我的完整代码更新答案。只需复制并粘贴即可。
  • 错误:(44, 9) 错误: 方法没有覆盖或实现超类型中的方法错误:(49, 22) 错误: 找不到符号方法 onBackPressed()
  • @JesseWalby 我已经编辑了我的答案,现在复制并粘贴它。
  • @JesseWalby 很高兴为您提供帮助。
【解决方案2】:

删除这个:

@Override
    public void onBackPressed() {
        if (WebView.canGoBack()) {
            WebView.goBack();
        } else {
            super.onBackPressed();
        }
    }

从你的内部类 MyWebViewClient 中。它应该在那个类之外。

public class MainActivity extends Activity {

   ...
   ...
   private class MyWebViewClient extends WebViewClient {
      ...
      ...
   }
   ...
   @Override
   public void onBackPressed() {
        if (myWebView.canGoBack()) {
            myWebView.goBack();
        } else {
            super.onBackPressed();
        }
    }
}

【讨论】:

  • 非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-07
  • 2014-09-27
  • 2023-03-28
  • 1970-01-01
  • 1970-01-01
  • 2014-04-14
  • 1970-01-01
相关资源
最近更新 更多