在WebView中打开URL而不是默认的浏览器。
在WebView中打开URL而不是默认的浏览器。
我正在创建一个简单的Webview
应用程序,其中textview
上有一些链接,并在webview
中打开这些链接,而不是默认浏览器。我的textview
包含各种不同的URL,并且我正在尝试在我的应用程序的webview中打开每个链接。
这是代码:
tv.setText("www.google.com www.facebook.com www.yahoo.com"); tv.setMovementMethod(LinkMovementMethod.getInstance());; tv.setText(Html.fromHtml(tv.getText().toString())); Linkify.addLinks(tv, Linkify.WEB_URLS); WebViewClient yourWebClient = new WebViewClient() { // 覆盖页面,这样它只在我的视图中加载 @Override public boolean shouldOverrideUrlLoading(WebView view, String url) { // 这一行让我只加载Firstdroid网页中的页面 if ( url.contains("www") == true ) // 加载新的URL,不覆盖URL链接 return false; // 返回true以覆盖URL加载(在这种情况下什么也不做)。 return true; } }; wv.getSettings().setJavaScriptEnabled(true); wv.getSettings().setSupportZoom(true); wv.getSettings().setBuiltInZoomControls(true); wv.setWebViewClient(yourWebClient); // 加载URL wv.loadUrl(url);
已经尝试过这个,这个和这个示例,但无法解决textview
中多个链接的问题。请帮我解决这个问题。感谢您的帮助。
编辑
我的Textview
包含如下字符串:
你好xyz还有一些陈述...xyz.com/abc/ 你好xyz还有一些陈述...xyz.com/abc/ 你好xyz还有一些陈述...xyz.com/abc/ 你好xyz还有一些陈述...xyz.com/abc/
类似这样的字符串和多个URL。
打开一个URL链接时,通常我们会默认使用默认的浏览器来打开链接。但是有时候我们希望在WebView中打开链接,而不是使用默认浏览器。下面的内容提供了解决这个问题的方法。
问题的解决需要以下几个步骤:
1. 将TextView中的文本链接化
2. 找到一种方法监听TextView中链接的点击事件
3. 获取被点击链接的URL,并在WebView中加载该链接
4. (可选)使TextView可点击同时保留文本选择能力
5. (可选)处理TextView中的格式化文本(不同的文本大小和样式)
第一步:将TextView中的文本链接化
我们可以使用以下代码将TextView中的文本链接化:
String text = "These are some sample links:\nwww.google.com\nwww.facebook.com\nwww.yahoo.com"; Spannable spannable = new SpannableString( Html.fromHtml(text) ); Linkify.addLinks(spannable, Linkify.WEB_URLS);
第二步和第三步:监听TextView中链接的点击事件并在WebView中打开链接
为了监听链接的点击事件并获取链接的URL,我们需要将TextView中的URLSpan替换为我们自定义的LinkSpan。以下是实现这个功能的代码:
URLSpan[] spans = spannable.getSpans(0, spannable.length(), URLSpan.class); for (URLSpan urlSpan : spans) { LinkSpan linkSpan = new LinkSpan(urlSpan.getURL()); int spanStart = spannable.getSpanStart(urlSpan); int spanEnd = spannable.getSpanEnd(urlSpan); spannable.setSpan(linkSpan, spanStart, spanEnd, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); spannable.removeSpan(urlSpan); } private class LinkSpan extends URLSpan { private LinkSpan(String url) { super(url); } public void onClick(View view) { String url = getURL(); if (mWebView != null && url != null) { mWebView.loadUrl(url); } } }
第四步:使TextView可点击同时保留文本选择能力
如果不设置MovementMethod为LinkMovementMethod,TextView将无法打开链接。以下是设置TextView可点击的代码:
tv.setMovementMethod(LinkMovementMethod.getInstance()); tv.setText(spannable, BufferType.SPANNABLE);
第五步:确保WebView在应用内加载页面而不是打开默认浏览器
为了确保WebView在应用内加载页面,我们需要设置WebView的WebViewClient,并重写shouldOverrideUrlLoading方法。以下是实现这个功能的代码:
mWebView.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { // we handle the url ourselves if it's a network url (http / https) return ! URLUtil.isNetworkUrl(url); } });
最后,为了实现可点击和可选择的TextView以及处理格式化文本,我们可以创建一个自定义的MovementMethod类,继承自ArrowKeyMovementMethod,并添加处理链接点击和处理格式化文本的功能。以下是实现这个功能的代码:
public class EnhancedLinkMovementMethod extends ArrowKeyMovementMethod { // ... }
以上是解决“在WebView中打开URL链接而不是默认浏览器”的问题的方法。通过以上步骤,我们可以实现在应用内部加载链接,并保留TextView的点击和选择能力。
问题的原因是希望在WebView中打开URL而不是默认的浏览器。解决方法是设置WebViewClient,并在shouldOverrideUrlLoading方法中返回false,以确保URL在WebView中打开而不是在默认浏览器中打开。
以下是解决该问题的代码示例:
ProgressDialog progressDialog = new ProgressDialog(WebActivity.this); WebView webview= (WebView) findViewById(R.id.webview); webview.getSettings().setDomStorageEnabled(true); webview.getSettings().setJavaScriptEnabled(true); webview.setVerticalScrollBarEnabled(false); webview.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); webview.getSettings().setPluginsEnabled(true); webview.getSettings().setSupportMultipleWindows(true); webview.getSettings().setSupportZoom(true); webview.setVerticalScrollBarEnabled(false); webview.setHorizontalScrollBarEnabled(false); webview.loadUrl("http://www.google.com"); webview.setWebViewClient(new WebViewClient() { public boolean shouldOverrideUrlLoading(WebView view, String url) { return false; } public void onPageFinished(WebView view, String url) { super.onPageFinished(view, url); progressDialog.dismiss(); } public void onPageStarted(WebView view, String url,Bitmap favicon) { super.onPageStarted(view, url, favicon); progressDialog.setMessage("Loading ..."); progressDialog.setCancelable(false); progressDialog.setCanceledOnTouchOutside(false); progressDialog.show(); } });
然而问题是,在TextView中有许多不同的URL,当用户点击任何链接时,希望在WebView中打开所需的URL。因此,我正在寻求如何解决这个问题。
问题的原因是用户在点击链接时,默认会在默认浏览器中打开链接,而不是在WebView中打开链接。解决方法是通过在AndroidManifest.xml文件中添加intent-filter,指定要在WebView中打开的链接的主机(host)。然后,在Activity中,可以通过获取Intent中的Action和Data来接收链接,并使用WebView的loadUrl方法来加载链接。
具体的解决方法如下所示:
在AndroidManifest.xml文件中的MainActivity的intent-filter中添加以下代码:
<activity android:name=".MainActivity" android:label="/title_activity_main"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <data android:scheme="http" /> <data android:scheme="https" /> <data android:host="www.apptecxinc.com" /> </intent-filter> </activity>
在MainActivity中的onCreate方法中添加以下代码:
String action = getIntent().getAction(); if (Intent.ACTION_VIEW.equals(action)) { Uri uri = getIntent().getData(); webview.loadUrl(urlsetup(uri.getPath())); }
通过以上的代码设置后,当用户点击指定主机(host)为www.apptecxinc.com的链接时,链接将会在WebView中打开,而不是默认浏览器中打开。