আমার অ্যান্ড্রয়েড অ্যাপ্লিকেশনটিতে পাঠ্যদর্শন লিঙ্কটি ক্লিক করুন handle


148

আমি বর্তমানে এমনভাবে একটি টেক্সটভিউতে এইচটিএমএল ইনপুট উপস্থাপন করছি:

tv.setText(Html.fromHtml("<a href='test'>test</a>"));

প্রদর্শিত হ'ল এইচটিএমএলটি আমাকে বাহ্যিক সংস্থার মাধ্যমে সরবরাহ করা হয়েছে, তাই আমি যা যা করব তার আশেপাশে জিনিসগুলি পরিবর্তন করতে পারি না, তবে আমি অবশ্যই href মান পরিবর্তন করতে, বলতে, অন্য কোনও কিছুর সাথে এইচটিএমএল এর সাথে কিছু রেজেক্সে টেম্পারিং করতে পারি।

আমি যা চাই তা হল লিঙ্কটি ব্রাউজার উইন্ডো খোলার পরিবর্তে অ্যাপ্লিকেশন থেকে সরাসরি কোনও লিঙ্ক ক্লিক করতে সক্ষম হ'ল। এটি কি আদৌ অর্জনযোগ্য? আমি অনুমান করছি যে href- মানটির প্রোটোকলটি "myApp: //" এর মতো কিছুতে সেট করা সম্ভব হবে এবং তারপরে এমন কিছু নিবন্ধভুক্ত করুন যা আমার অ্যাপ্লিকেশনটিকে সেই প্রোটোকলটি পরিচালনা করতে দেয়। যদি সত্যই এটি সর্বোত্তম উপায় হয় তবে আমি কীভাবে এটি সম্পন্ন হয়েছে তা জানতে চাই, তবে আমি আশা করি কেবল এটি বলার একটি সহজ উপায় আছে, "যখন এই পাঠ্যদর্শনটিতে একটি লিঙ্ক ক্লিক করা হয়, তখন আমি একটি ইভেন্ট উত্থাপন করতে চাই যা প্রাপ্ত হয় ইনপুট পরামিতি হিসাবে লিঙ্কের href মান "


আমি অন্য কিছু পাওয়া [এখানে] [1] [1]: stackoverflow.com/questions/7255249/... আশা করি যে আপনাকে সহায়তা করতে পারে ^^
Mr_DK

1
ডেভিড, আমি আপনার অনুরূপ একটি মামলা করছি, আমি একটি বহিরাগত উত্স (ওয়েব) থেকেও এইচটিএমএল পেয়েছি, তবে আমি কীভাবে href মানকে ছড়িয়ে দেব যাতে আমি এই সমাধানটি প্রয়োগ করতে পারি।
X09

উত্তর:


182

প্রায় এক বছর পরে এটি আসছে, আমি আলাদাভাবে আমার পদ্ধতিটি সমাধান করেছি manner যেহেতু আমি লিঙ্কটি আমার নিজের অ্যাপ্লিকেশন দ্বারা পরিচালনা করতে চেয়েছিলাম, তাই এর সমাধান রয়েছে যা কিছুটা সহজ।

ডিফল্ট অভিপ্রায় ফিল্টার ছাড়াও, আমি কেবলমাত্র আমার লক্ষ্য ক্রিয়াকলাপটি ACTION_VIEWঅভিপ্রায় শুনতে , এবং বিশেষত স্কিমের সাথে withcom.package.name

<intent-filter>
    <category android:name="android.intent.category.DEFAULT" />
    <action android:name="android.intent.action.VIEW" />
    <data android:scheme="com.package.name" />  
</intent-filter>

এর অর্থ যে এর সাথে শুরু হওয়া লিঙ্কগুলি com.package.name://আমার ক্রিয়াকলাপ দ্বারা পরিচালিত হবে।

সুতরাং আমাকে যা করতে হবে তা হ'ল একটি URL তৈরি করা যাতে আমি জানাতে চাই এমন তথ্য রয়েছে:

com.package.name://action-to-perform/id-that-might-be-needed/

আমার লক্ষ্য কার্যকলাপে, আমি এই ঠিকানাটি পুনরুদ্ধার করতে পারি:

Uri data = getIntent().getData();

আমার উদাহরণে, আমি কেবল dataনাল মানগুলি পরীক্ষা করতে পারতাম , কারণ যখন কখন এটি শূন্য হয় না, তখন আমি জানতে পারি যে এটি একটি লিঙ্কের মাধ্যমে আহ্বান করা হয়েছিল। সেখান থেকে, যথাযথ ডেটা প্রদর্শন করতে সক্ষম হওয়ার জন্য আমি ইউআরএল থেকে আমার প্রয়োজনীয় নির্দেশাবলিগুলি বের করি ract


1
আরে আপনার উত্তর নিখুঁত। ঠিকঠাক কাজ করছে। তবে আরও কি আমরা এগুলি দিয়ে পাস করা ডেটার ডেটা প্রেরণ করতে পারি?
ব্যবহারকারী 861973

4
@ ব্যবহারকারী 861973: হ্যাঁ, getDataআপনাকে সম্পূর্ণ ইউআরআই দেয়, আপনি এটি ব্যবহার করতে পারেন getDataStringযা কোনও পাঠ্য উপস্থাপন করে। যে কোনও উপায়ে আপনি ইউআরএল তৈরি করতে পারেন যাতে আপনার প্রয়োজনীয় সমস্ত ডেটা থাকে com.package.name://my-action/1/2/3/4এবং আপনি সেই স্ট্রিং থেকে তথ্যটি বের করতে পারেন।
ডেভিড হেডলন্ড

3
এই ধারণাটি বুঝতে আমার একদিন সময় লেগেছে, তবে আমি আপনাকে বলছি কী - এটির পক্ষে এটি ভাল ছিল।
ডেনিস

7
দুর্দান্ত সমাধান এটি টেক্সটভিউতে যুক্ত করতে ভুলবেন না যাতে এটি লিঙ্কগুলিকে সক্ষম করে। tv.setMovementMethod (LinkMovementMethod.getInstance ());
ড্যানিয়েল বেনিডিক্ট

3
দুঃখিত, তবে ক্রিয়াকলাপে আমি কোন পদ্ধতিতে বলব Uri data = getIntent().getData();? আমি Activity not found to handle intentত্রুটি গ্রহণ করা অবিরত। - ধন্যবাদ
rgv

62

অন্য উপায়ে, লিঙ্কাইফাই থেকে কিছুটা ধার নেওয়া তবে আপনাকে আপনার হ্যান্ডলিংটি কাস্টমাইজ করতে দেয়।

কাস্টম স্প্যান ক্লাস:

public class ClickSpan extends ClickableSpan {

    private OnClickListener mListener;

    public ClickSpan(OnClickListener listener) {
        mListener = listener;
    }

    @Override
    public void onClick(View widget) {
       if (mListener != null) mListener.onClick();
    }

    public interface OnClickListener {
        void onClick();
    }
}

সহায়ক ফাংশন:

public static void clickify(TextView view, final String clickableText, 
    final ClickSpan.OnClickListener listener) {

    CharSequence text = view.getText();
    String string = text.toString();
    ClickSpan span = new ClickSpan(listener);

    int start = string.indexOf(clickableText);
    int end = start + clickableText.length();
    if (start == -1) return;

    if (text instanceof Spannable) {
        ((Spannable)text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    } else {
        SpannableString s = SpannableString.valueOf(text);
        s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        view.setText(s);
    }

    MovementMethod m = view.getMovementMethod();
    if ((m == null) || !(m instanceof LinkMovementMethod)) {
        view.setMovementMethod(LinkMovementMethod.getInstance());
    }
}

ব্যবহার:

 clickify(textView, clickText,new ClickSpan.OnClickListener()
     {
        @Override
        public void onClick() {
            // do something
        }
    });

আরেকটি সমাধান হ'ল আপনার কাস্টম স্প্যানগুলির সাথে স্প্যানগুলি প্রতিস্থাপন করা, স্ট্যাকওভারফ্লো. com
a/

দুর্দান্ত মার্জিত সমাধান
মারিও জেডেরিক

আমি এটি বাস্তবায়নের সবচেয়ে সহজ সমাধান বলে মনে করেছি। টেক্সটভিউগুলিতে ধারাবাহিকভাবে লিঙ্কগুলিকে ক্লিকযোগ্য করে তোলার উপায় পাওয়ার জন্য গুগল কখনও এই জগাখিচুড়ি পরিষ্কার করেনি। এটি একটি স্প্যানকে জোর করার জন্য এটি একটি নৃশংস পদ্ধতির, তবে এটি বিভিন্ন ওএস সংস্করণে ভালভাবে কাজ করে .. +1
রাগ করুন আইজি

55

যদি পাঠ্য দর্শনে একাধিক লিঙ্ক থাকে। উদাহরণস্বরূপ পাঠ্যদর্শনটিতে "https: //" এবং "টেল নো" রয়েছে আমরা একটি প্যাটার্নের ভিত্তিতে লিঙ্কমোভমেন্ট পদ্ধতিটি কাস্টমাইজ করতে পারি এবং শব্দের জন্য ক্লিকগুলি পরিচালনা করতে পারি। সংযুক্তটি হল কাস্টমাইজড লিংক মুভমেন্ট পদ্ধতি।

public class CustomLinkMovementMethod extends LinkMovementMethod
{

private static Context movementContext;

private static CustomLinkMovementMethod linkMovementMethod = new CustomLinkMovementMethod();

public boolean onTouchEvent(android.widget.TextView widget, android.text.Spannable buffer, android.view.MotionEvent event)
{
    int action = event.getAction();

    if (action == MotionEvent.ACTION_UP)
    {
        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);

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
        if (link.length != 0)
        {
            String url = link[0].getURL();
            if (url.startsWith("https"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Link was clicked", Toast.LENGTH_LONG).show();
            } else if (url.startsWith("tel"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Tel was clicked", Toast.LENGTH_LONG).show();
            } else if (url.startsWith("mailto"))
            {
                Log.d("Link", url);
                Toast.makeText(movementContext, "Mail link was clicked", Toast.LENGTH_LONG).show();
            }
            return true;
        }
    }

    return super.onTouchEvent(widget, buffer, event);
}

public static android.text.method.MovementMethod getInstance(Context c)
{
    movementContext = c;
    return linkMovementMethod;
}

এটি নিম্নলিখিত পদ্ধতিতে পাঠ্যদর্শন থেকে কল করা উচিত:

textViewObject.setMovementMethod(CustomLinkMovementMethod.getInstance(context));

8
আপনার কোনও প্রসঙ্গটি "পিছনের পিছনে" আলাদা স্ট্যাটিক ভেরিয়েবলে পাস করার দরকার নেই, এ ধরণের দুর্গন্ধযুক্ত। widget.getContext()পরিবর্তে ব্যবহার করুন।
সার্জেজ কোয়েজেভ

হ্যাঁ প্রসঙ্গটি মুছে ফেলা যায়। এটি সের্গেজ দেখানোর জন্য ধন্যবাদ
অরুণ

6
এটি দুর্দান্তভাবে কাজ করে তবে সেটটেক্সটের পরে আপনাকে অবশ্যই সেটমোভমেন্টমথোড কল করতে হবে, অন্যথায় এটি ডিফল্ট লিঙ্কমোভমেন্টমেথোডের সাথে ওভাররাইট হয়ে যাবে
রে ব্রিটনের

কাজ করে, তবে প্রতিটি ক্লিকে স্প্যানগুলির মাধ্যমে পুনরাবৃত্তি করার দরকার নেই। এছাড়াও অবস্থান অনুযায়ী ফিল্টারটি ত্রুটিগুলির প্রবণ দেখায়। এই উত্তরে অনুরূপ এককালীন সূচনা পদ্ধতির দেখানো হয়েছে ।
মিস্টার স্মিথ

@ অরুন দয়া করে মন্তব্য অনুসারে আপনার উত্তর আপডেট করুন।
Behrouz.M

45

@ অরুন উত্তরের উপর ভিত্তি করে এখানে আরও জেনেরিক সমাধান দেওয়া হয়েছে

public abstract class TextViewLinkHandler extends LinkMovementMethod {

    public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event) {
        if (event.getAction() != MotionEvent.ACTION_UP)
            return super.onTouchEvent(widget, buffer, event);

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

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
        if (link.length != 0) {
            onLinkClick(link[0].getURL());
        }
        return true;
    }

    abstract public void onLinkClick(String url);
}

ব্যবহার করার জন্য এটি শুধু বাস্তবায়ন onLinkClickএর TextViewLinkHandlerবর্গ। এই ক্ষেত্রে:

    textView.setMovementMethod(new TextViewLinkHandler() {
        @Override
        public void onLinkClick(String url) {
            Toast.makeText(textView.getContext(), url, Toast.LENGTH_SHORT).show();
        }
    });

2
দুর্দান্ত কাজ করে দ্রষ্টব্য: অ্যান্ড্রয়েড যুক্ত করতে ভুলবেন না: আপনার পাঠ্যদর্শনটিতে অটোলিঙ্ক = "ওয়েব"। অটোলিংকের অ্যাট্রিবিউট ব্যতীত এটি কাজ করে না।
ওকরাকোজ

আমি এখানে তালিকাভুক্ত সমস্ত সমাধান চেষ্টা করেছি। এটি আমার জন্য সেরা। এটি পরিষ্কার, ব্যবহার করা সহজ এবং শক্তিশালী। ইঙ্গিত: এর বেশিরভাগ অংশ পেতে আপনার Html.fromHtml এর সাথে কাজ করা উচিত।
কাই ওয়াং

1
সর্বোত্তম উত্তর! ধন্যবাদ! অ্যান্ড্রয়েড যুক্ত করতে ভুলবেন না: এক্সএমএলে বা কোড লিঙ্কাইফকম্পট.এডিডলিংকগুলিতে অটোলিঙ্ক = "ওয়েব";
নিকিতা অ্যাক্সিওনোভ

1
একটি আপাতদৃষ্টিতে সাধারণ প্রয়োজনীয়তাটি অ্যান্ড্রয়েডে বেশ জটিল বিষয়। এই দ্রবণটি সেই ব্যথাটিকে অনেকটা দূরে নিয়ে যায়। দেখেছেন যে অ্যান্ড্রয়েড এন এ কাজ করার জন্য অটোলিঙ্ক = "ওয়েব" প্রয়োজন হয় না .. +1
রাগ করুন আইটুই

1
পৃথিবীতে কেন এই জাতীয় শ্রেণীর জন্মগতভাবে অস্তিত্ব নেই - এত বছর পরেও - আমার বাইরে। লিংক মোভমেন্টমেডোডের জন্য অ্যান্ড্রয়েডকে ধন্যবাদ, তবে আমি সাধারণত আমার নিজের ইউআই এর নিয়ন্ত্রণ চাই। আপনি আমাকে ইউআই ইভেন্টগুলি রিপোর্ট করতে পারেন এবং তাই আমার কন্ট্রোলার এগুলি পরিচালনা করতে পারে।
পদ্ধতির স্বাক্ষর

10

এটি খুব সহজ আপনার কোডটিতে এই লাইনটি যুক্ত করুন:

tv.setMovementMethod(LinkMovementMethod.getInstance());

1
জনাথন আপনার জবাবের জন্য ধন্যবাদ। হ্যাঁ, আমি মুভমেন্টমেথোদ সম্পর্কে জানতাম; আমি কী সম্পর্কে নিশ্চিত নই যে কীভাবে আমার নিজের অ্যাপ্লিকেশনটিতে লিংক ক্লিকটি হ্যান্ডেল করা উচিত তা কেবলমাত্র কোনও ব্রাউজার খোলার চেয়ে ডিফল্ট চলন পদ্ধতি হিসাবে (গ্রহণযোগ্য উত্তর দেখুন)। যাই হোক ধন্যবাদ.
ডেভিড হেডলন্ড

5

সমাধান

আমি একটি ছোট ক্লাস প্রয়োগ করেছি যার সাহায্যে আপনি টেক্সটভিউতে লম্বা ক্লিকগুলি নিজেই পরিচালনা করতে পারবেন এবং টেক্সটভিউয়ের লিঙ্কগুলিতে ট্যাপ করুন।

বিন্যাস

TextView android:id="@+id/text"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:autoLink="all"/>

TextViewClickMovement.java

import android.content.Context;
import android.text.Layout;
import android.text.Spannable;
import android.text.method.LinkMovementMethod;
import android.text.style.ClickableSpan;
import android.util.Patterns;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.widget.TextView;

public class TextViewClickMovement extends LinkMovementMethod {

    private final String TAG = TextViewClickMovement.class.getSimpleName();

    private final OnTextViewClickMovementListener mListener;
    private final GestureDetector                 mGestureDetector;
    private TextView                              mWidget;
    private Spannable                             mBuffer;

    public enum LinkType {

        /** Indicates that phone link was clicked */
        PHONE,

        /** Identifies that URL was clicked */
        WEB_URL,

        /** Identifies that Email Address was clicked */
        EMAIL_ADDRESS,

        /** Indicates that none of above mentioned were clicked */
        NONE
    }

    /**
     * Interface used to handle Long clicks on the {@link TextView} and taps
     * on the phone, web, mail links inside of {@link TextView}.
     */
    public interface OnTextViewClickMovementListener {

        /**
         * This method will be invoked when user press and hold
         * finger on the {@link TextView}
         *
         * @param linkText Text which contains link on which user presses.
         * @param linkType Type of the link can be one of {@link LinkType} enumeration
         */
        void onLinkClicked(final String linkText, final LinkType linkType);

        /**
         *
         * @param text Whole text of {@link TextView}
         */
        void onLongClick(final String text);
    }


    public TextViewClickMovement(final OnTextViewClickMovementListener listener, final Context context) {
        mListener        = listener;
        mGestureDetector = new GestureDetector(context, new SimpleOnGestureListener());
    }

    @Override
    public boolean onTouchEvent(final TextView widget, final Spannable buffer, final MotionEvent event) {

        mWidget = widget;
        mBuffer = buffer;
        mGestureDetector.onTouchEvent(event);

        return false;
    }

    /**
     * Detects various gestures and events.
     * Notify users when a particular motion event has occurred.
     */
    class SimpleOnGestureListener extends GestureDetector.SimpleOnGestureListener {
        @Override
        public boolean onDown(MotionEvent event) {
            // Notified when a tap occurs.
            return true;
        }

        @Override
        public void onLongPress(MotionEvent e) {
            // Notified when a long press occurs.
            final String text = mBuffer.toString();

            if (mListener != null) {
                Log.d(TAG, "----> Long Click Occurs on TextView with ID: " + mWidget.getId() + "\n" +
                                  "Text: " + text + "\n<----");

                mListener.onLongClick(text);
            }
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent event) {
            // Notified when tap occurs.
            final String linkText = getLinkText(mWidget, mBuffer, event);

            LinkType linkType = LinkType.NONE;

            if (Patterns.PHONE.matcher(linkText).matches()) {
                linkType = LinkType.PHONE;
            }
            else if (Patterns.WEB_URL.matcher(linkText).matches()) {
                linkType = LinkType.WEB_URL;
            }
            else if (Patterns.EMAIL_ADDRESS.matcher(linkText).matches()) {
                linkType = LinkType.EMAIL_ADDRESS;
            }

            if (mListener != null) {
                Log.d(TAG, "----> Tap Occurs on TextView with ID: " + mWidget.getId() + "\n" +
                                  "Link Text: " + linkText + "\n" +
                                  "Link Type: " + linkType + "\n<----");

                mListener.onLinkClicked(linkText, linkType);
            }

            return false;
        }

        private String getLinkText(final TextView widget, final Spannable buffer, final MotionEvent event) {

            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) {
                return buffer.subSequence(buffer.getSpanStart(link[0]),
                        buffer.getSpanEnd(link[0])).toString();
            }

            return "";
        }
    }
}

ব্যবহার

TextView tv = (TextView) v.findViewById(R.id.textview);
tv.setText(Html.fromHtml("<a href='test'>test</a>"));
textView.setMovementMethod(new TextViewClickMovement(this, context));

লিংক

আশাকরি এটা সাহায্য করবে! আপনি কোড খুঁজে পেতে পারেন এখানে


3

আমি তৈরি একটি লাইব্রেরি ব্যবহার করে কেবল বিকল্প সমাধান ভাগ করে নিতে। সঙ্গে Textoo , ভালো অর্জন করা যেতে পারে:

TextView locNotFound = Textoo
    .config((TextView) findViewById(R.id.view_location_disabled))
    .addLinksHandler(new LinksHandler() {
        @Override
        public boolean onClick(View view, String url) {
            if ("internal://settings/location".equals(url)) {
                Intent locSettings = new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS);
                startActivity(locSettings);
                return true;
            } else {
                return false;
            }
        }
    })
    .apply();

বা গতিশীল এইচটিএমএল উত্স সহ:

String htmlSource = "Links: <a href='http://www.google.com'>Google</a>";
Spanned linksLoggingText = Textoo
    .config(htmlSource)
    .parseHtml()
    .addLinksHandler(new LinksHandler() {
        @Override
        public boolean onClick(View view, String url) {
            Log.i("MyActivity", "Linking to google...");
            return false; // event not handled.  Continue default processing i.e. link to google
        }
    })
    .apply();
textView.setText(linksLoggingText);

এটি শীর্ষ উত্তর হওয়া উচিত। অবদানের জন্য স্যার আপনাকে ধন্যবাদ
মারিয়ান পাভেল

3

যারা এখানে আরও বিকল্পের সন্ধান করে তার জন্য একটি

// Set text within a `TextView`
TextView textView = (TextView) findViewById(R.id.textView);
textView.setText("Hey @sarah, where did @jim go? #lost");
// Style clickable spans based on pattern
new PatternEditableBuilder().
    addPattern(Pattern.compile("\\@(\\w+)"), Color.BLUE,
       new PatternEditableBuilder.SpannableClickedListener() {
        @Override
        public void onSpanClicked(String text) {
            Toast.makeText(MainActivity.this, "Clicked username: " + text,
                Toast.LENGTH_SHORT).show();
        }
}).into(textView);

রিসোর্স : কোডপথ


2
public static void setTextViewFromHtmlWithLinkClickable(TextView textView, String text) {
    Spanned result;
    if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.N) {
        result = Html.fromHtml(text, Html.FROM_HTML_MODE_LEGACY);
    } else {
        result = Html.fromHtml(text);
    }
    textView.setText(result);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
}

1

উদাহরণস্বরূপ ব্যবহার করে আমি টেক্সটভিউয়ের রঙ নীল করে দিয়েছি:

android:textColor="#3399FF"

এক্সএমএল ফাইলে। এটি কীভাবে আন্ডারলাইন করা যায় তা এখানে ব্যাখ্যা করা হয়েছে

তারপরে একটি পদ্ধতি নির্দিষ্ট করতে এর অন্লিক সম্পত্তিটি ব্যবহার করুন (আমি অনুমান করছি যে আপনি setOnClickListener(this)অন্য উপায় হিসাবে কল করতে পারেন ), যেমন:

myTextView.setOnClickListener(new OnClickListener() {
public void onClick(View v) {
    doSomething();
}
});

এই পদ্ধতিতে, আমি সাধারণ হিসাবে যা খুশি তাই করতে পারি, যেমন একটি উদ্দেশ্য শুরু করি। মনে রাখবেন যে আপনার তাত্পর্যপূর্ণতার myTextView.setMovementMethod(LinkMovementMethod.getInstance());অনক্রিট () পদ্ধতিতে আপনার এখনও স্বাভাবিক কাজটি করতে হবে ।


1

এই উত্তরটি জোনাথন এস-এর দুর্দান্ত সমাধানটিকে প্রসারিত করে:

পাঠ্য থেকে লিঙ্কগুলি বের করতে আপনি নিম্নলিখিত পদ্ধতিটি ব্যবহার করতে পারেন:

private static ArrayList<String> getLinksFromText(String text) {
        ArrayList links = new ArrayList();

        String regex = "\(?\b((http|https)://www[.])[-A-Za-z0-9+&@#/%?=~_()|!:,.;]*[-A-Za-z0-9+&@#/%=~_()|]";
        Pattern p = Pattern.compile(regex);
        Matcher m = p.matcher(text);
        while (m.find()) {
            String urlStr = m.group();
            if (urlStr.startsWith("(") && urlStr.endsWith(")")) {
                urlStr = urlStr.substring(1, urlStr.length() - 1);
            }
            links.add(urlStr);
        }
        return links;
    }

clickify()পদ্ধতিতে প্যারামিটারগুলির একটি অপসারণ করতে এটি ব্যবহার করা যেতে পারে :

public static void clickify(TextView view,
                                final ClickSpan.OnClickListener listener) {

        CharSequence text = view.getText();
        String string = text.toString();


        ArrayList<String> linksInText = getLinksFromText(string);
        if (linksInText.isEmpty()){
            return;
        }


        String clickableText = linksInText.get(0);
        ClickSpan span = new ClickSpan(listener,clickableText);

        int start = string.indexOf(clickableText);
        int end = start + clickableText.length();
        if (start == -1) return;

        if (text instanceof Spannable) {
            ((Spannable) text).setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        } else {
            SpannableString s = SpannableString.valueOf(text);
            s.setSpan(span, start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
            view.setText(s);
        }

        MovementMethod m = view.getMovementMethod();
        if ((m == null) || !(m instanceof LinkMovementMethod)) {
            view.setMovementMethod(LinkMovementMethod.getInstance());
        }
    }

ক্লিকস্প্যানের কয়েকটি পরিবর্তন:

public static class ClickSpan extends ClickableSpan {

        private String mClickableText;
        private OnClickListener mListener;

        public ClickSpan(OnClickListener listener, String clickableText) {
            mListener = listener;
            mClickableText = clickableText;
        }

        @Override
        public void onClick(View widget) {
            if (mListener != null) mListener.onClick(mClickableText);
        }

        public interface OnClickListener {
            void onClick(String clickableText);
        }
    }

এখন আপনি কেবল টেক্সটভিউতে পাঠ্যটি সেট করতে পারেন এবং তারপরে একটি শ্রোতা যুক্ত করতে পারেন:

TextViewUtils.clickify(textWithLink,new TextUtils.ClickSpan.OnClickListener(){

@Override
public void onClick(String clickableText){
  //action...
}

});


0

উদাহরণ: ধরুন আপনি পাঠ্যদর্শনটিতে কিছু পাঠ্য সেট করেছেন এবং আপনি একটি নির্দিষ্ট পাঠ্য এক্সপ্রেশনটিতে একটি লিঙ্ক সরবরাহ করতে চান: " # পৃষ্ঠাগুলিতে ক্লিক করুন আপনাকে ফেসবুক.কম এ নিয়ে যাবে"

এক্সএমএল লেআউটে:

<TextView
            android:id="@+id/testtext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content" />

ক্রিয়াকলাপে:

String text  =  "Click on #facebook will take you to facebook.com";
tv.setText(text);
Pattern tagMatcher = Pattern.compile("[#]+[A-Za-z0-9-_]+\\b");
String newActivityURL = "content://ankit.testactivity/";
Linkify.addLinks(tv, tagMatcher, newActivityURL);

একটি ট্যাগ প্রদানকারী হিসাবে এটি তৈরি করুন:

public class TagProvider extends ContentProvider {

    @Override
    public int delete(Uri arg0, String arg1, String[] arg2) {
        // TODO Auto-generated method stub
        return 0;
    }

    @Override
    public String getType(Uri arg0) {
        return "vnd.android.cursor.item/vnd.cc.tag";
    }

    @Override
    public Uri insert(Uri arg0, ContentValues arg1) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public boolean onCreate() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public Cursor query(Uri arg0, String[] arg1, String arg2, String[] arg3,
                        String arg4) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public int update(Uri arg0, ContentValues arg1, String arg2, String[] arg3) {
        // TODO Auto-generated method stub
        return 0;
    }

}

ম্যানিফেস্ট ফাইলটিতে সরবরাহকারীর জন্য প্রবেশের জন্য এবং পরীক্ষার ক্রিয়াকলাপটিকে এইভাবে করুন:

<provider
    android:name="ankit.TagProvider"
    android:authorities="ankit.testactivity" />

<activity android:name=".TestActivity"
    android:label = "@string/app_name">
    <intent-filter >
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:mimeType="vnd.android.cursor.item/vnd.cc.tag" />
    </intent-filter>
</activity>

এখন আপনি যখন # পৃষ্ঠাগুলিতে ক্লিক করবেন তখন এটি টেস্টএক্টিভাইটি শুরু করবে। এবং পরীক্ষার ক্রিয়াকলাপে আপনি ডেটা হিসাবে পেতে পারেন:

Uri uri = getIntent().getData();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.