web-dev-qa-db-ja.com

Android:LinkView TextView

リンクする必要のあるテキストビューがあります。これが私がやっていることです。

TextView text = (TextView) view.findViewById(R.id.name);
text.setText("Android...Update from Android");
Pattern pattern = Pattern.compile("Android");
String scheme = "www.Android.com";
Linkify.addLinks(text, pattern, scheme);

テキストビューは「Android ... Androidから更新」というテキストで正しく表示されますが、2つの問題に直面しています。

1)テキスト文字列に「Android」という文字列の2つのインスタンスがあります。したがって、両方のテキストがリンクされています。最初に出現したものだけをリンクしたい。どうすればいいですか?

2)linkfyテキストをクリックすると、ブラウザが開きますが、URLがおかしいです。開こうとするURLは「www.comandroid」です。ここで何が悪いのか分かりません。 URLの「Android」というテキストは置き換えられています。テキストをリンクするときに私は何か間違ったことをしていますか?.

どんな助けも高く評価されます。

27
Faheem Kalsekar

簡単な方法は、autoLinkをXMLレイアウトに配置することです。

  Android:autoLink="web" 
22
Fernando JS

これを簡単に行う静的メソッドを作成しました。

/**
 * Add a link to the TextView which is given.
 * 
 * @param textView the field containing the text
 * @param patternToMatch a regex pattern to put a link around
 * @param link the link to add
 */
public static void addLink(TextView textView, String patternToMatch,
        final String link) {
    Linkify.TransformFilter filter = new Linkify.TransformFilter() {
        @Override public String transformUrl(Matcher match, String url) {
            return link;
        }
    };
    Linkify.addLinks(textView, Pattern.compile(patternToMatch), null, null,
            filter);
}

そしてOPはそれを簡単に使用できます:

addLink(text, "^Android", "http://www.Android.com");
19
Shawn Lauzon

Linkifyの経験はあまりありません。これまでのところ、テキスト内のURLをリンクにして、異なるバージョンのaddLinksによって自動的に処理されるようにしました。

ただし、「Android」で照合するために使用している正規表現は、正規表現を微調整することにより、文字列を開始するものにのみ一致するように変更できます。

Pattern pattern = Pattern.compile("^Android");

「^」が追加されていることに注意してください。これは、正規表現マッチャーが文字列を開始するときにパターン「Android」のみに一致するように指示します。それがあなたの弦でうまくいくなら、素晴らしいです。リンクしたいWordが行の先頭にない他のケースがある場合は、正規表現をさらに調べる必要があります。詳細については、このサイトをお勧めします regular-expressions.info

9
Ian Leslie

テキストを含むすべてのURLを開きたい場合は、これを行うことができます。

            TextView textview=(TextView)findViewById(R.id.text);

    textview.setText("Android....Update from Android...www.Android.com");
    Linkify.addLinks(textview, Linkify.WEB_URLS);
    textview.setMovementMethod(LinkMovementMethod.getInstance());

すべてのURLで機能する可能性があります。

8
ankita gahoi

ここでShawnsの回答とSpunkerBabaのコメントから、私はこのヘルパークラスで出てきました。これにより、URLに追加される変更内容の二重追加の問題がなくなります。

package com.your.package;

public class Linkify {

    /**
     * @param textView
     *            textView who's text you want to change
     * @param linkThis
     *            a regex of what text to turn into a link
     * @param toThis
     *            the url you want to send them to
     */
    public static void addLinks(TextView textView, String linkThis, String toThis) {
        Pattern pattern = Pattern.compile(linkThis);
        String scheme = toThis;
        Android.text.util.Linkify.addLinks(textView, pattern, scheme, new MatchFilter() {
            @Override
            public boolean acceptMatch(CharSequence s, int start, int end) {
                return true;
            }
        }, new TransformFilter() {

            @Override
            public String transformUrl(Matcher match, String url) {
                return "";
            }
        });
    }

}

使用法:

 Linkify.addLinks(profileTextView, "BlundellApps.com", "http://www.BlundellApps.com");
3
Blundell

私はあなたが本当に必要なものは次のように単純なものだと思います:

final TextView textView = ((BodyViewHolder) holder).textView;
textView.setText(text);
Linkify.addLinks(textView, Linkify.WEB_URLS); // I would do this only during view creation, btw.

具体的にはURLを追跡しています。 Linkigy.ALLの使用を提案する人もいますが、これは望ましくありません。

public static final int ALL = WEB_URLS | EMAIL_ADDRESSES | PHONE_NUMBERS | MAP_ADDRESSES;

また、他の人々は追加を提案しています:

textview.setMovementMethod(LinkMovementMethod.getInstance());

リンク規則を追加した後、addLinksはすでにその内部でそれを行っています;-)

乾杯!

1
cesards

ラムダ式のコルティンの場合、このようになります

val pattern = Pattern.compile(link.title)
Linkify.addLinks(view, pattern, null, null, { matcher, url -> link.href })
1
Kit
TextView noteView = (TextView) findViewById(R.id.noteview);
noteView.setText(someContent);
Linkify.addLinks(noteView, Linkify.ALL);
0
Arpit Patel

問題が解決しました。最初の問題の解決策は、Ian Leslieによって提供された答えです。 2番目の問題の解決策は次のとおりです。API "Linkify.addLinks"の動作は、リンクする文字列をURLの末尾に追加するというものです。たとえば、「Android」というテキストを「www.Android.com」にリンクしたい場合。最終的なURLは「www.Android.comAndroid」ですが、これは私が必要とするものではありません。

public static final void addLinks (TextView text, Pattern p, String scheme, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter)
TransformFilter transformFilter = new TransformFilter() {
public final String transformUrl(final Matcher match, String url) { 
return ""; 
} }; 

APIのtransformFilterはnull文字列を返します。だから私の最終的なURLは「www.Android.com」です

0
Faheem Kalsekar