0

如何打开a href仅在 webview 上的 html 字符串而不是在浏览器上?

我正在使用 LinkMovementMethod,这可以在其他应用程序(例如来自 youtube 的视频)上打开它,但我有一些链接需要仅在 webview 上打开。

这是一个示例 html 字符串

String html_text =  "<h1>sample text</h1><p><small>February 1 1970</small></p><p class=\"text-center\"><img src=\"https://www.google.com\" /></p><p>sample (<a href=\"https://google.com\">here</a>).</p>"

我需要 a href 仅在 webview 上打开。

这是我的代码

详细活动

public class DetailActivity extends AppCompatActivity implements Html.ImageGetter {

    private TextView newsContentTv;
    private WebView newsWebView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_detail_news);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        newsWebView = (WebView) findViewById(R.id.newsWebView);
        setSupportActionBar(toolbar);

        // add back arrow to toolbar
        if (getSupportActionBar() != null){
            getSupportActionBar().setDisplayHomeAsUpEnabled(true);
            getSupportActionBar().setDisplayShowHomeEnabled(true);
        }

        newsContentTv = (TextView) findViewById(R.id.textNewsContext);

        Intent i = getIntent();

        String news_content = i.getStringExtra("detail_content");

        Spanned spanned = Html.fromHtml(news_content, this, null);
        Spannable spannable = new SpannableString( Html.fromHtml(news_content) );
        newsContentTv.setText(spanned);

        newsContentTv.setMovementMethod(LinkMovementMethod.getInstance());

    }

任何帮助将非常感激。

4

3 回答 3

1
// Create an unencoded HTML string
// then convert the unencoded HTML string into bytes, encode
// it with Base64, and load the data.
String html_text =
 "<h1>sample text</h1><p><small>February 1 1970</small></p><p class=\"text-center\"><img src=\"https://www.google.com\" /></p><p>sample (<a href=\"https://google.com\">here</a>).</p>";
String encodedHtml = Base64.encodeToString(html_text.getBytes(),
    Base64.NO_PADDING);
newsWebView.loadData(encodedHtml, "text/html", "base64");

我希望这能帮到您。

于 2020-02-05T08:44:56.093 回答
0
WebView webview = (WebView)this.findViewById(R.id.webview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadDataWithBaseURL("", data, "text/html", "UTF-8", "");
于 2020-02-05T09:24:49.500 回答
0

您的问题表明您需要在 web 视图中打开单击的 url,而不是导航到浏览器。我可以想到两种方法来做到这一点。

  1. 第一种情况,如果不需要 aTextview来显示可点击的链接,那么您可以将字符串加载到WebView自身中(如其他人所述)并设置 a WebViewClient(这部分很重要)
  newsWebView.loadDataWithBaseURL(null, html_text, "text/html", "UTF-8", null);
  newsWebView.setWebViewClient(new WebViewClient());
 // add below line to support youtube videos etc.
  newsWebView.getSettings().setJavaScriptEnabled(true);
  newsWebView.getSettings().setJavaScriptCanOpenWindowsAutomatically(true);

这样任何点击都会保持导航不变WebView。如果没有客户端,它将导航到浏览器。但是你应该注意这将加载和替换里面的内容,所以你的原始链接不会出现在屏幕上。

  1. 第二种情况,如果您需要来自TextView简单设置的点击newsContentTv.setMovementMethod(LinkMovementMethod.getInstance());将不起作用,因为默认情况下它会使正常意图导致它导航到浏览器或相关应用程序,您需要将其删除。然后,您必须创建一个自定义类来扩展LinkMovementMethod并覆盖触摸事件,以将点击的 url 加载到您的 webview 中,如下所示:
public class CustomLinkMovementMethod extends LinkMovementMethod {

    private static CustomLinkMovementMethod instance;

    public static CustomLinkMovementMethod getInstance() {
        if (instance == null)
            instance = new CustomLinkMovementMethod();
        return instance;
    }

    @Override
    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        int action = event.getAction();

        if (action == MotionEvent.ACTION_UP) {
            int x = (int) event.getX() - widget.getTotalPaddingLeft() + widget.getScrollX();
            int y = (int) event.getY() - widget.getTotalPaddingTop() + widget.getScrollY();
            Layout layout = widget.getLayout();
            int line = layout.getLineForVertical(y);
            int off = layout.getOffsetForHorizontal(line, x);
            URLSpan[] urlSpans = buffer.getSpans(off, off, URLSpan.class);
            if (urlSpans.length != 0) {
                // You can check log to see if you are getting the url on click.
                Log.d("TAG", String.valueOf(urlSpans[0].getURL()));

               /* If you've made this an inner class in your activity
                  you can directly load the url into your webview.
                  Else you will have to create listeners to get url in activity
                  on event trigger */
                newsWebView.loadData(urlSpans[0].getURL());
                return true;
            }
        }
        return super.onTouchEvent(widget, buffer, event);
    }
}

TextView像这样使用它

   newsContentTv.setMovementMethod(CustomLinkMovementMethod.getInstance());

看看这是否适合你,没想到答案会变得这么长。

于 2020-02-05T11:11:13.170 回答