টেক্সটভিউ - অ্যান্ড্রয়েডের লিঙ্কগুলি থেকে আন্ডারলাইন সরান


94

আমি textviewডেটাবেস থেকে লিঙ্কগুলি প্রদর্শন করতে দুটি ব্যবহার করছি , আমি লিঙ্কের রঙগুলি পরিবর্তন করতে পেরেছি তবে আমি আন্ডারলাইনটি সরাতে চাই

email.setText(c.getString(5));
    website.setText(c.getString(6));
    Linkify.addLinks(email, Linkify.ALL);
    Linkify.addLinks(website, Linkify.ALL);

আমি কি এক্সএমএল বা কোড থেকে এটি করতে পারি?

উত্তর:


220

আপনি কোডগুলিতে এটি URLSpanসংস্করণগুলির নীচে রূপরেখা না দিয়ে উদাহরণগুলি সন্ধান এবং প্রতিস্থাপনের মাধ্যমে করতে পারেন। আপনি কল করার পরে Linkify.addLinks(), আপনার stripUnderlines()প্রতিটি নীচে আটকানো ফাংশনটি কল করুন TextView:

    private void stripUnderlines(TextView textView) {
        Spannable s = new SpannableString(textView.getText());
        URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
        for (URLSpan span: spans) {
            int start = s.getSpanStart(span);
            int end = s.getSpanEnd(span);
            s.removeSpan(span);
            span = new URLSpanNoUnderline(span.getURL());
            s.setSpan(span, start, end, 0);
        }
        textView.setText(s);
    }

এর জন্য ইউআরএলস্প্যানের একটি কাস্টমাইজড সংস্করণ প্রয়োজন যা টেক্সটপেইন্টের "আন্ডারলাইন" বৈশিষ্ট্যটি সক্ষম করে না:

    private class URLSpanNoUnderline extends URLSpan {
        public URLSpanNoUnderline(String url) {
            super(url);
        }
        @Override public void updateDrawState(TextPaint ds) {
            super.updateDrawState(ds);
            ds.setUnderlineText(false);
        }
    }

9
এই সমাধানটি অনুমান করে যে স্প্যানটির পাঠ্যটি ইউআরএল এর সমান, যা একটি বেসিক http: // লিঙ্কের ক্ষেত্রে। যাইহোক, লিঙ্কাইফাই স্মার্ট এবং একটি ফোন নম্বর (212) 555-1212 এর মত URL এ রূপান্তর করে tel:2125551212new URLSpanNoUnderlineকল পাস হওয়া উচিত span.getURL()এই তথ্য ধরে রাখা, অন্যথায় আপনি যখন ক্লিক করা যে কারণ ব্যতিক্রম খারাপ লিঙ্ক উৎপন্ন। আমি এই প্রস্তাবিত সমাধানটি আপনার উত্তরের জন্য সম্পাদনা সারিতে রেখেছি, যেহেতু আমার নিজের কাছে সম্পাদনার অনুমতি নেই।
মাইক মুলার 24'11

8
আমার জন্য কাজ করছি না। এটি লাইন স্প্যানিয়েবল এস = (স্প্যানিয়েবল) টেক্সটভিউ.জেটটেক্সট () এ ক্লাস কাস্ট ব্যতিক্রম দেয়;
ব্রিজেশ ঠাকুর

4
কেবল সেই লাইনটি স্প্যানিয়েবল s = নতুন স্প্যানিয়েবল স্ট্রিং (টেক্সটভিউ.সেটটেক্সট ()) দিয়ে প্রতিস্থাপন করুন;
ফলিভিরা

4
সঙ্গে প্রতিস্থাপন Spannable s = (Spannable) textView.getText()সঙ্গে Spannable s = new SpannableString(textView.getText());আমার জন্য কাজ করে না। আমি যদি কাস্টিংয়ে ফিরে যাই তবে তা যদি টেক্সটভিউতে থাকে তবে তা কাজ করে android:textIsSelectable=true। কোন ধারণা কেন?
বি লিট

4
android:autoLinkগুণটি নিয়ে এই কাজটি করার কোনও উপায় আছে কি ? নাহলে মনে হয় কার্যক্ষমতায় অন্তর্নির্মিত হওয়ার জন্য আপনাকে নিজের অনক্লিক পদ্ধতি তৈরি করতে হবে।
আলকারিন

33

একটি পাঠ্যদর্শন এবং সামগ্রী দেওয়া হয়েছে:

TextView textView = (TextView) findViewById(R.id.your_text_view_id);
String content = "your <a href='http://some.url'>html</a> content";

হাইপারলিঙ্কগুলি থেকে আন্ডারলাইনগুলি সরিয়ে দেওয়ার জন্য এখানে একটি সংক্ষিপ্ত উপায়:

Spannable s = (Spannable) Html.fromHtml(content);
for (URLSpan u: s.getSpans(0, s.length(), URLSpan.class)) {
    s.setSpan(new UnderlineSpan() {
        public void updateDrawState(TextPaint tp) {
            tp.setUnderlineText(false);
        }
    }, s.getSpanStart(u), s.getSpanEnd(u), 0);
}
textView.setText(s);

এটি robUx4 দ্বারা প্রস্তাবিত পদ্ধতির উপর ভিত্তি করে।

লিঙ্কগুলিকে ক্লিকযোগ্য করে তুলতে আপনাকে কল করতে হবে:

textView.setMovementMethod(LinkMovementMethod.getInstance());

7
আপনি যদি সংস্থান থেকে স্ট্রিং পাওয়ার চেষ্টা করেন তবে এটি কাজ করে না, String content = getResources().getString(R.string.content);যার ফলে কোনও লিঙ্ক আর কাজ করে না।
বৃষ্টি ম্যান

4
যথোপযুক্ত সৃষ্টিকর্তা? একটি স্ট্রিং জানে না যে এটি কোথা থেকে এসেছে। স্ট্রিং সামগ্রীতে অবশ্যই একটি পার্থক্য থাকতে হবে।
অ্যাড্রায়ান কোস্টার 11 ই

নিশ্চিত না কেন তবে আমি যখন স্ট্রিংটি কল করি তখন এটি url প্রদর্শন করে না res/values/strings.xmlযা থেকে উদাহরণের মতো একই জিনিস থাকে exactly আপনি আপনার শেষ পর্যন্ত পরীক্ষা করতে পারেন?
বৃষ্টি ম্যান

আমি অবশ্যই আমার শেষে পরীক্ষা করতে যাচ্ছি না (-:। আপনি যদি স্ট্রিংয়ের বিষয়বস্তু সম্পর্কে নিশ্চিত হতে চান তবে উভয় স্ট্রিংকে তাদের হ্যাশকোডের সাথে একসাথে লগ করুন above ঠিক একই স্ট্রিংস
অ্যাড্রিয়ান কোস্টার

4
আপনি যদি এটি উত্স থেকে স্ট্রিং পেয়ে কাজ করতে চান তবে আপনার এটি এনকোড করা দরকার। >= &gt;, <= &lt;ইত্যাদি উদাহরণস্বরূপ: বিকাশকারী.অ্যান্ড্রয়েড<string name="link_to_google" >&lt;a href="https://www.google.com/"&gt;Google&lt;/a&gt;</string>
গাইড

11

UnderlineSpan ইতিমধ্যে বিদ্যমান, তবে কেবল আন্ডারলাইন সেট করতে পারে।

আরেকটি সমাধান হ'ল প্রতিটি বিদ্যমানটিতে একটি আন্ডারলাইন স্প্যান যুক্ত করা URLSpan। সুতরাং চিত্রের ঠিক আগে আন্ডারলাইন অবস্থা অক্ষম করা আছে। এইভাবে আপনি আপনার URLSpan(সম্ভবত কাস্টম) ক্লাস এবং অন্য সমস্ত স্টাইল সেট করে রেখেছেন।

public class NoUnderlineSpan extends UnderlineSpan {
    public NoUnderlineSpan() {}

    public NoUnderlineSpan(Parcel src) {}

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
    }
}

বিদ্যমান ইউআরএলস্প্যান অবজেক্টটি না সরিয়ে আপনি কীভাবে সেট করেছেন এটি এখানে:

URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
for (URLSpan span: spans) {
    int start = s.getSpanStart(span);
    int end = s.getSpanEnd(span);
    NoUnderlineSpan noUnderline = new NoUnderlineSpan();
    s.setSpan(noUnderline, start, end, 0);
}

3

আমি একটি সমাধান প্রয়োগ করেছি, যা আমার মতে, আরও মার্জিত। আমি একটা রীতিTextView তৈরি করেছি । এইভাবে TextViewহাইপারলিংক সহ আপনার জন্য অতিরিক্ত কোড চালানোর দরকার নেই ।

package com.example.view;

import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.text.Spannable;
import android.text.SpannableString;
import android.text.style.URLSpan;
import android.util.AttributeSet;

import com.example.utils.UrlSpanNoUnderline;

public class TextViewNoUnderline extends AppCompatTextView {
    public TextViewNoUnderline(Context context) {
        this(context, null);
    }

    public TextViewNoUnderline(Context context, AttributeSet attrs) {
        this(context, attrs, android.R.attr.textViewStyle);
    }

    public TextViewNoUnderline(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
        setSpannableFactory(Factory.getInstance());
    }

    private static class Factory extends Spannable.Factory {
        private final static Factory sInstance = new Factory();

        public static Factory getInstance() {
            return sInstance;
        }

        @Override
        public Spannable newSpannable(CharSequence source) {
            return new SpannableNoUnderline(source);
        }
    }

    private static class SpannableNoUnderline extends SpannableString {
        public SpannableNoUnderline(CharSequence source) {
            super(source);
        }

        @Override
        public void setSpan(Object what, int start, int end, int flags) {
            if (what instanceof URLSpan) {
                what = new UrlSpanNoUnderline((URLSpan) what);
            }
            super.setSpan(what, start, end, flags);
        }
    }
}

এবং ইউরালস্প্যান ননউন্ডারলাইনের জন্য কোড:

package com.jankstudios.smmagazine.utils;

import android.text.TextPaint;
import android.text.style.URLSpan;

public class UrlSpanNoUnderline extends URLSpan {
    public UrlSpanNoUnderline(URLSpan src) {
        super(src.getURL());
    }

    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setUnderlineText(false);
    }
}

3

এখানে কোটলিন এক্সটেনশন ফাংশন:

fun TextView.removeLinksUnderline() {
    val spannable = SpannableString(text)
    for (u in spannable.getSpans(0, spannable.length, URLSpan::class.java)) {
        spannable.setSpan(object : URLSpan(u.url) {
            override fun updateDrawState(ds: TextPaint) {
                super.updateDrawState(ds)
                ds.isUnderlineText = false
            }
        }, spannable.getSpanStart(u), spannable.getSpanEnd(u), 0)
    }
    text = spannable
}

ব্যবহার:

txtView.removeLinksUnderline()    

2

যখনই, স্প্যানিয়েবলের সাথে ইউআরএল আন্ডারলাইন সরানোর চেষ্টা করুন আমি কেবল এই বিষয়গুলিতে পরামর্শ দিই:

1> কাস্টম শ্রেণি তৈরি করা:

private class URLSpanNoUnderline extends URLSpan {
            public URLSpanNoUnderline(String url) {
                super(url);
            }
            @Override public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
            }
        }

এর জন্য ইউআরএলস্প্যানের একটি কাস্টমাইজড সংস্করণ প্রয়োজন যা টেক্সটপেইন্টের "আন্ডারলাইন" বৈশিষ্ট্যটি সক্ষম করে না

2> বিস্তৃত পাঠ্য সহ সেটস্প্যান:

spannableText.setSpan(new URLSpanNoUnderline(UrlText), 0, UrlText.length() , 0);

এখানে, spannableText বস্তুর SpannableString ... !!!


এটিই সেরা সমাধান এবং একমাত্র আমার জন্য কাজ করেছে
গুইল

এই সমাধানটি একটি URL সহ একটি পাঠ্যের জন্য।
কুলমাইন্ড

1

আপনি যদি টেক্সটভিউ অটলিংক সম্পত্তি ব্যবহার করে থাকেন এবং আপনি আন্ডারলাইনগুলি সরাতে চান তবে আপনি এটি ব্যবহার করতে পারেন:

প্রথমে আন্ডারলাইনস্প্যান প্রসারিত করুন এবং আন্ডারলাইন সরান:

public class NoUnderlineSpan extends UnderlineSpan {

    @Override
    public void updateDrawState(TextPaint ds) {
        ds.setUnderlineText(false);
    }
}

দ্বিতীয়ত, নুউন্ডারলাইনস্প্যান তৈরি করুন এবং উদাহরণ তৈরি করুন, স্ট্রিং পাঠ্য থেকে একটি স্প্যানিয়েবল তৈরি করুন এবং স্প্যানটিকে স্প্যানিয়েবলে সেট করুন:

NoUnderlineSpan mNoUnderlineSpan = new NoUnderline();
if (yourTextView.getText() instanceof Spannable) {
    Spannable s = (Spannable) yourTextView.getText();
    s.setSpan(mNoUnderlineSpan, 0, s.length(), Spanned.SPAN_MARK_MARK);
}

তথ্যসূত্র: http://prog3.com/sbdm/blog/maosidiaoxian/article/details/39156563


দুর্দান্ত সমাধান, তবে টেলিফোন অ্যাপ থেকে ফিরে আসার পরে (ফোন নম্বরটিতে ক্লিক করার পরে) এটি আবার টেক্সটভিউকে আন্ডারলাইন করে।
কুলমাইন্ড

4
হ্যাঁ, যদি আপনার ক্রিয়াকলাপ পটভূমিতে যায় তবে পাঠ্যদর্শনটি কোনও আন্ডারলাইন স্থিতি বজায় রাখতে আপনার এই কোডটি আপনার অনারিউম ক্রিয়াকলাপ কার্যক্রমে ব্যবহার করা উচিত।
ফ্রান্সিসকো মোয়া

0

আপনি যদি কেবল এই পাঠ্যটি চান এবং ইউআরএল লিঙ্কটি নিয়ে বিরক্ত করবেন না

এই হবে ফালা লিংক কিন্তু রাখুন টেক্সট

private Spannable stripLinks(String content) {
    Spannable s = new SpannableString(content);
    URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
    for (URLSpan span : spans) {
        s.removeSpan(span);
    }

    return s;
}

কোন অতিরিক্ত ক্লাস প্রয়োজন

String content = "<a href='http://stackoverflow.com'>Stack Overflow</a> Rocks!";
textView.setText(stripLinks(content));

0

এখানে আমার পদ্ধতি

 public static void removeUnderlines(Spannable p_Text) {
            if (p_Text != null && p_Text.toString().length() > 0) {
                URLSpan[] spans = p_Text.getSpans(0, p_Text.length(), URLSpan.class);

                for (URLSpan span : spans) {
                    int start = p_Text.getSpanStart(span);
                    int end = p_Text.getSpanEnd(span);
                    p_Text.removeSpan(span);
                    span = new URLSpanNoUnderline(span.getURL());
                    p_Text.setSpan(span, start, end, 0);
                }
            }
        }

এটি কল করুন

AppController.removeUnderlines((Spannable) eventEmail.getText());

অ্যাপকন্ট্রোলার হ'ল আমার অ্যাপ্লিকেশন ক্লাস যেখানে আমি এই পদ্ধতিটি রেখেছি যাতে আমি যে কোনও জায়গা থেকে এটি অ্যাক্সেস করতে পারি


0

জামারিন ব্যবহারকারীদের জন্য এই পোস্টটি সন্ধান করুন, আমি কীভাবে এটি কাজ করতে পারি তা এখানে:

  1. আন্ডারলাইনগুলি বাদ দিয়ে পরিচালনা করার জন্য একটি কাস্টম স্প্যান ক্লাস তৈরি করুন।
    class URLSpanNoUnderline : URLSpan {
            public URLSpanNoUnderline (string url) : base (url) {
            }

            public override void UpdateDrawState (TextPaint ds) {
                base.UpdateDrawState (ds);
                ds.UnderlineText = false;
            }
        }
  1. সমস্ত url স্প্যানগুলি সন্ধান করতে এবং আমাদের কাস্টম স্প্যানগুলির সাথে সেগুলি প্রতিস্থাপনের জন্য একটি এক্সটেনশন পদ্ধতি তৈরি করুন Create
public static void StripUnderlinesFromLinks (this TextView textView) {
                var spannable = new SpannableStringBuilder (textView.TextFormatted);
                var spans = spannable.GetSpans (0, spannable.Length (), Java.Lang.Class.FromType (typeof (URLSpan)));
                foreach (URLSpan span in spans) {
                    var start = spannable.GetSpanStart (span);
                    var end = spannable.GetSpanEnd (span);
                    spannable.RemoveSpan(span);
                    var newSpan = new URLSpanNoUnderline (span.URL);
                    spannable.SetSpan(newSpan, start, end, 0);
                }
                textView.TextFormatted = spannable;
            }

-1
public void setView()
{
TextView t=(TextView) findViewById(R.id.textView3);
        t.setText(Html.fromHtml("<a href=http://www.urdusms.net > UrduSMS "));
        t.setTextColor(Color.BLACK);
        t.setGravity(Gravity.CENTER);
        t.setMovementMethod(LinkMovementMethod.getInstance());

         Spannable s = (Spannable) t.getText();
            URLSpan[] spans = s.getSpans(0, s.length(), URLSpan.class);
            for (URLSpan span: spans) {
                int start = s.getSpanStart(span);
                int end = s.getSpanEnd(span);
                s.removeSpan(span);
                span = new URLSpanline_none(span.getURL());
                s.setSpan(span, start, end, 0);
            }
        t.setText(s);
 }
//inner class is    
private class URLSpanline_none extends URLSpan {
            public URLSpanline_none(String url) {
                super(url);
            }
            @Override public void updateDrawState(TextPaint ds) {
                super.updateDrawState(ds);
                ds.setUnderlineText(false);
            }
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.