【问题标题】:How can we open TextView's links into Webview我们如何将 TextView 的链接打开到 Webview
【发布时间】:2011-11-07 11:42:58
【问题描述】:

当我点击TextView的链接时,如何打开TextView的链接到WebView

【问题讨论】:

标签: android


【解决方案1】:
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_VIEWActivity。假设您有一个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>

【讨论】:

  • 感谢 Pixie,但它将在默认浏览器中打开,而不是在 WebView 中。 :(
  • 哦,我误解了你的问题。在这种情况下,您可以使用自己的架构创建一个 URL,并将其注册到 AndroidManifest.xml 中的意图过滤器。
  • 再次感谢你,但你能解释一下吗?
  • @Michael,如果我从网上获取文本但无法修改方案怎么办?
  • @Ozuf 你是什么意思你不能?您始终可以使用自定义方案创建链接并将另一个链接添加到它作为查询参数。然后在处理此 URI 时,您可以提取内部链接并在 WebView 中打开它。
【解决方案2】:

以下对我有用。我刚刚使用了来自 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;
        }
    });

【讨论】:

    【解决方案3】:

    如果你复制nastylion 的 Kotlin 解决方案,你可以像这样使用它:

    textView.handleUrlClicks { url ->
        Timber.d("click on found span: $url")
        // Call WebView here.
    }
    

    您还可以看到an article 及其LinkMovementMethodlinkify,但这太难了(包含不同的掩码和弹出菜单)。

    【讨论】:

      【解决方案4】:

      将属性 android:autolink 设置为您的 textview 布局

          <TextView
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"        
          android:text="your text"
          android:autoLink="web" />
      

      【讨论】:

      • 这会在浏览器中打开链接。答案是如何在 WebView 中打开链接
      • 只是一个小问题。应用 autoLink 后,颜色变为绿色并且应用不同的颜色不起作用。怎么样?
      • 你拯救了我的一天。谢谢:)
      【解决方案5】:
      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>
      

      【讨论】:

        猜你喜欢
        • 2020-09-13
        • 1970-01-01
        • 1970-01-01
        • 2012-05-08
        • 2016-03-19
        • 2017-03-08
        • 1970-01-01
        • 1970-01-01
        • 2021-09-23
        相关资源
        最近更新 更多