【发布时间】:2011-11-07 11:42:58
【问题描述】:
当我点击TextView的链接时,如何打开TextView的链接到WebView。
【问题讨论】:
标签: android
当我点击TextView的链接时,如何打开TextView的链接到WebView。
【问题讨论】:
标签: android
Spanned spanned = Html.fromHtml("<a href=\"http://google.com\">google.com</a>");
textView.setText(spanned);
编辑:这不是处理链接点击的理想方式,但我不知道还有其他方式。
您的主要活动包含一个带有链接的TextView。链接 URL 具有自定义方案。
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
TextView link = (TextView)findViewById(R.id.link);
link.setText(
Html.fromHtml("<a href='myscheme://www.google.com'>link</a>"));
link.setMovementMethod(LinkMovementMethod.getInstance());
}
}
当点击此链接时,Android 使用链接 URL 启动带有 ACTION_VIEW 的 Activity。假设您有一个WebViewActivity,它使用此自定义方案处理 URI。它获取传递的 URI 并将其方案替换为 http。
public class WebViewActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate( savedInstanceState );
if( savedInstanceState == null ) {
String url =
getIntent().getDataString().replace("myscheme://", "http://");
// do something with this URL.
}
}
}
要处理自定义 URI 方案 WebViewActivity 必须在 AndroidManifest.xml 文件中有一个意图过滤器:
<activity android:name=".WebViewActivity" android:exported="false">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="myscheme" />
</intent-filter>
</activity>
【讨论】:
WebView 中打开它。
以下对我有用。我刚刚使用了来自 LinkMovementMethod 的 onTouchEvent 代码。您可以像上面提到的 Michael 那样在 textView 中设置链接,也可以在 strings.xml 中设置它。我使用这个库打开链接https://github.com/DreaminginCodeZH/CustomTabsHelper。
textView.setMovementMethod(new MovementMethod() {
@Override
public void initialize(TextView widget, Spannable text) {
}
@Override
public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onKeyUp(TextView widget, Spannable text, int keyCode, KeyEvent event) {
return false;
}
@Override
public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) {
return false;
}
@Override
public void onTakeFocus(TextView widget, Spannable text, int direction) {
}
@Override
public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) {
return false;
}
/**
* Borrowed code for detecting and selecting link from
* {@link LinkMovementMethod#onTouchEvent(TextView, Spannable, MotionEvent)}
*/
@Override
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
int action = event.getAction();
if (action == MotionEvent.ACTION_UP ||
action == MotionEvent.ACTION_DOWN) {
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
ClickableSpan[] link = buffer.getSpans(off, off, ClickableSpan.class);
if (link.length != 0) {
if (action == MotionEvent.ACTION_UP) {
// do whatever else you want here on link being clicked
Selection.removeSelection(buffer);
} else if (action == MotionEvent.ACTION_DOWN) {
Selection.setSelection(buffer,
buffer.getSpanStart(link[0]),
buffer.getSpanEnd(link[0]));
}
return true;
} else {
Selection.removeSelection(buffer);
}
}
return false;
}
@Override
public boolean onGenericMotionEvent(TextView widget, Spannable text, MotionEvent event) {
return false;
}
@Override
public boolean canSelectArbitrarily() {
return false;
}
});
【讨论】:
如果你复制nastylion 的 Kotlin 解决方案,你可以像这样使用它:
textView.handleUrlClicks { url ->
Timber.d("click on found span: $url")
// Call WebView here.
}
您还可以看到an article 及其LinkMovementMethod 和linkify,但这太难了(包含不同的掩码和弹出菜单)。
【讨论】:
将属性 android:autolink 设置为您的 textview 布局
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="your text"
android:autoLink="web" />
【讨论】:
hotel_website=(TextView)viewflipper.findViewById(R.id.tv_website);
hotel_website.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String url = "http://" +hotel_website.getText().toString();
Intent i = new Intent(Intent.ACTION_VIEW);
i.setData(Uri.parse(url));
startActivity(i);
}
});
在 XML 中
<TextView
android:clickable="true"
</TextView>
【讨论】: