Soru Android: Linkify TextView


Ben, linki vermem gereken bir metin görüşüm var. İşte yaptığım şey ..

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);

Metin görünümü "Android ... Android'den Güncelleştir" metniyle doğru şekilde görüntüleniyor, ancak iki sorunla karşılaşıyorum.

1) Metin dizgimin "Android" dizesinin iki örneği var. Yani, her iki metin de linklenmiştir. Sadece ilk ortaya çıkacak yeri görmek istiyorum. Nasıl yapmalıyım?

2) Bağlantılı metne tıkladığımda tarayıcı açılır, ancak URL gariptir. Açmaya çalıştığı url "www.comandroid" dir. Burada neyin yanlış gittiğini bilmiyorum. URL'deki "android" metni değiştiriliyor. Metni Bağlarken yanlış bir şey yapıyorum.

Herhangi bir yardım çok takdir edilecektir.


25
2018-01-20 11:02


Menşei


Sorun çözüldü. İlk problemin çözümü Ian Leslie tarafından sağlanan cevaptır. İkinci soruna çözüm şu şekildedir: API "Linkify.addLinks" in davranışı öyle bir şekildedir ki, URL'lerin sonuna URL'lerin sonuna eklemek istediğiniz dizeyi ekler. Ex..if için "www.android.com" ile "Android" metnini indirmek istiyorsan ... son url, ihtiyacım olanı değil "www.android.comAndroid" dir.Yani kamu statik final void addLinks kullandım ( TextView metni, Desen p, Dize düzeni, Linkify.MatchFilter matchFilter, Linkify.TransformFilter transformFilter) - Faheem Kalsekar
TransformFilter transformFilter = new TransformFilter () {public final String transformUrl (son Matcher eşleşmesi, String url) {return ""; }}; API transformFilter boş bir dize döndürür. Yani son URL'm "www.android.com - Faheem Kalsekar


Cevaplar:


Kolay yol, XML düzeninde autoLink koyulur.

  android:autoLink="web" 

19
2017-11-19 16:09





Bunu basitçe yapan statik bir yöntem oluşturdum:

/**
 * 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);
}

Ve OP bunu basitçe kullanabilir:

addLink(text, "^Android", "http://www.android.com");

18
2018-04-26 18:09



Bunun neden sadece bu çalışmanın, sadece autolink etkin olduğunda işe yaramadığını fark etmek için işe yaramadığını anlamaya çalışırken harcadım. “Otomatik bağlama” etkinleştirildiğinde, tüm ek Linkify işlemleri dikkate alınmaz. Aramayı bitirdim text.setAutoLinkMask(0); Bu işlevi çağırmadan önce ve hem de autolink hem de bu özel linkify yaptı. Umarım bu, aynı sorunla karşılaşan herkese yardımcı olur. - Saifur Rahman Mohsin


Linkify ile fazla tecrübem yok. Şimdiye kadar yapmak istediğim tek şey, metinde URL'leri, farklı bir sürüm tarafından otomatik olarak işlenen bağlantılara dönüştürmektir. addLinks.

Ancak, "Android" ile eşleşmek için kullandığınız normal ifade, normal ifadenizi değiştirerek yalnızca dizeyi başlatan ile eşleşecek şekilde değiştirilebilir:

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

'^' Eklenmesi dikkat edin. Bu, normal ifade eşleştiricisine, dizeyi başladığında yalnızca 'Android' modeliyle eşleşmesini söyler. Bu dizeleri ile çalışacaksa o zaman harika. Eğer link vermek istediğiniz kelime başka bir satırınız varsa, hattın başında değil, düzenli ifadeleri biraz daha araştırmanız gerekecek. Daha fazla bilgi edinmek için bu siteyi tavsiye ederim regular-expressions.info


9
2018-01-20 11:24



Teşekkürler. Cevabınız ilk problemimi çözdü. Bunun için +1. - Faheem Kalsekar


Metinde bulunan tüm URL'leri açmak istiyorsanız bunu yapabilirsiniz.

            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());

Tüm URL'ler için işe yarayabilir.


6
2018-01-20 11:24





Burada Shawns'ın yanıtından ve SpunkerBaba'nın yorumundan bu yardımcı sınıfla çıktım. Bu, URL'nize ne değiştirildiğinizin çift eklenmesi sorununu durdurur.

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 "";
            }
        });
    }

}

kullanımı:

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

2
2017-11-03 18:25



Mükemmel çalışıyor. Bunu sadece bir sınıf yerine bir işlev olarak kullanıyorum. Teşekkürler! - Igor Ganapolsky


Sorun çözüldü. İlk problemin çözümü Ian Leslie tarafından sağlanan cevaptır. İkinci soruna çözüm şu şekildedir: API "Linkify.addLinks" in davranışı öyle bir şekildedir ki, URL'lerin sonuna URL'lerin sonuna eklemek istediğiniz dizeyi ekler. Ex..if için "www.android.com" ile "Android" metnini içeri aktarmak istiyorsunuz. Nihai URL "www.android.comAndroid", ihtiyacım olan şey değil.

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 boş bir dize döndürür. Yani son URL'm "www.android.com"


0
2017-11-20 05:48



Lütfen komple çözümle cevaplarınızı düzenleyebilir misiniz? - KJEjava48
Linkify.addLinks'te (text, pattern, scheme, matchFilter, transformFilter) matchFilter ve transformFilter için değer ne olmalıdır? - KJEjava48


TextView noteView = (TextView) findViewById(R.id.noteview);
noteView.setText(someContent);
Linkify.addLinks(noteView, Linkify.ALL);

0
2017-09-10 10:27