পাঠ্য প্রদর্শনের অংশটি কীভাবে সেট করা যায় তা ক্লিকযোগ্য


212

আমার কাছে " অ্যান্ড্রয়েড একটি সফটওয়্যার স্ট্যাক " লেখা রয়েছে। এই পাঠ্যে আমি " স্ট্যাক " পাঠ্যটি ক্লিকযোগ্য তা সেট করতে চাই । অর্থে আপনি যদি এটিতে ক্লিক করেন তবে এটি কোনও নতুন ক্রিয়াকলাপে পুনর্নির্দেশ করা হবে (ব্রাউজারে নয়)।

চেষ্টা করেছি কিন্তু পাচ্ছি না।


12
"আমি চেষ্টা করেছি কিন্তু আমি পাচ্ছি না" আপনি কী চেষ্টা করেছেন এবং কোথায় আপনি ব্যর্থ
হয়েছেন

উত্তর:


534

android.text.style.ClickableSpan আপনার সমস্যা সমাধান করতে পারে

SpannableString ss = new SpannableString("Android is a Software stack");
ClickableSpan clickableSpan = new ClickableSpan() {
    @Override
    public void onClick(View textView) {
        startActivity(new Intent(MyActivity.this, NextActivity.class));
    }
    @Override
    public void updateDrawState(TextPaint ds) {
        super.updateDrawState(ds);
        ds.setUnderlineText(false);
    }
};
ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

TextView textView = (TextView) findViewById(R.id.hello);
textView.setText(ss);
textView.setMovementMethod(LinkMovementMethod.getInstance());
textView.setHighlightColor(Color.TRANSPARENT);

এক্সএমএলে:

<TextView 
  ...
  android:textColorLink="@drawable/your_selector"
/>

2
আপনি কি পাঠ্যদর্শনটিতে একাধিক ক্লিকযোগ্য স্প্যান অবজেক্ট সেট করতে পারেন?
জোনাথন

4
হ্যাঁ আপনি বিস্তৃত স্ট্রিংয়ের জন্য কয়েকটি ক্লিকযোগ্য স্প্যান সেট করতে পারেন।
ডিগ্রাটনিক

15
রঙটি নীল রূপে পেতে, আপনি যুক্ত করতে পারেন: ForegroundColorSpan fcs = new ForegroundColorSpan(Color.BLUE); ss.setSpan(fcs, 22, 27, Spannable.SPAN_INCLUSIVE_INCLUSIVE);
xemacobra

4
আমার ক্ষেত্রে নীল থেকে অন্য কিছুতে রঙ পরিবর্তন করার জন্য এটি ঘটেছিল। সেট ForegroundColorSpanমধ্যে setSpan পরে আপনি যোগ্য বিঘত গঠন করেছি। ক্লিকযোগ্য স্প্যানের আগে অগ্রভাগ স্থাপন করা, নতুন রঙ প্রতিফলিত হবে না।
শুভম এ।

1
এই লাইনের জন্য ধন্যবাদ স্টেক্সটভিউ.সেটমোভমেন্টমেথোড (লিংকোভমেন্ট মেথড.জেটইনস্ট্যান্স ()); textView.setHighlightColor (Color.TRANSPARENT);
সাসুখে উচিহ

99

ভিতরে একাধিক লিঙ্ক তৈরি করার জন্য আমার ফাংশন TextView

fun TextView.makeLinks(vararg links: Pair<String, View.OnClickListener>) {
    val spannableString = SpannableString(this.text)
    for (link in links) {
        val clickableSpan = object : ClickableSpan() {
            override fun onClick(view: View) {
                Selection.setSelection((view as TextView).text as Spannable, 0)
                view.invalidate()
                link.second.onClick(view)
            }
        }
        val startIndexOfLink = this.text.toString().indexOf(link.first)
        spannableString.setSpan(clickableSpan, startIndexOfLink, startIndexOfLink + link.first.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    }
    this.movementMethod = LinkMovementMethod.getInstance() // without LinkMovementMethod, link can not click
    this.setText(spannableString, TextView.BufferType.SPANNABLE)
}

ব্যবহার

my_text_view.makeLinks(
        Pair("Terms of Service", View.OnClickListener {
            Toast.makeText(applicationContext, "Terms of Service Clicked", Toast.LENGTH_SHORT).show()
        }),
        Pair("Privacy Policy", View.OnClickListener {
            Toast.makeText(applicationContext, "Privacy Policy Clicked", Toast.LENGTH_SHORT).show()
        }))

এক্সএমএল

<TextView
    android:id="@+id/my_text_view"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Please accept Terms of Service and Privacy Policy"
    android:textColorHighlight="#f00" // background color when pressed
    android:textColorLink="#0f0"
    android:textSize="20sp" />

ডেমো

উল্লেখ

লিংক হাইলাইট নির্বাচন পরিষ্কার করার জন্য সমাধান অনুসরণ করুন https://stackoverflow.com/a/19445108/5381331


এটি নিখুঁতভাবে কাজ করছে। তবে এমন একটি অদ্ভুত আচরণ প্রদর্শিত হচ্ছে। আমার কাছে একটি নীতি "পলিসি" দিয়ে শেষ হচ্ছে। যেখানে "।" ক্লিকযোগ্য স্প্যানিয়েবল দ্বারা এড়ানো হবে। কারও কি একই সমস্যা আছে ?. দ্য "." যদি কোনও পাঠ্য দৃশ্যের শেষ অক্ষর হয় তবেই তা এড়িয়ে যায়।
নিখিল

দুর্দান্ত সমাধান, তবে কাউকে তারের স্থানীয়করণ (একাধিক ভাষার অ্যাপ) থাকলে যত্ন নেওয়া দরকার
হিমাংশু মরি

ধন্যবাদ। এটা দুর্দান্ত কাজ করছে। আমি বলতে চাই যে আপনি যদি <স্ট্রিং নাম = "স্ট্রিং"> কিছু% 1 $ s সম্পাদনা </ স্ট্রিং> এর মতো ফর্ম্যাট স্ট্রিং সেট করে থাকেন। প্রথমে আপনি% 1 $ s এর স্থানে যা চান সেটি সেট করুন মনে রাখুন তারপরে মেকলিংকস পদ্ধতিতে কল করুন।
রাজন

আপনি কি দয়া করে বলতে পারেন আমি কীভাবে এই ফাংশনটি ব্যবহার করতে পারি কারণ যখন আমি কেবলমাত্র আপনার অনক্রিট পদ্ধতিতে আটকানোর সময় এটি ত্রুটি দেখায়।
ব্ল্যাকব্লাইন্ড

1
@ ব্ল্যাকব্লাইন্ড আপনি কোন ত্রুটি পেয়েছেন? যদি এটি আমদানিতে কোনও ত্রুটি হয় তবে দয়া করে এটি সঠিকভাবে আমদানি করুন। এছাড়াও আপনার অনিয়মের ভিতরে ফাংশন রাখা উচিত নয়, এটি বাইরে রাখুন
ফান ভ্যান লিনহ

35

আপনি এই পোস্টে বর্ণিত হিসাবে ক্লিকযোগ্যস্প্যান ব্যবহার করতে পারেন

কোডের উদাহরণ:

TextView myTextView = new TextView(this);
String myString = "Some text [clickable]";
int i1 = myString.indexOf("[");
int i2 = myString.indexOf("]");
myTextView.setMovementMethod(LinkMovementMethod.getInstance());
myTextView.setText(myString, BufferType.SPANNABLE);
Spannable mySpannable = (Spannable)myTextView.getText();
ClickableSpan myClickableSpan = new ClickableSpan() {
   @Override
   public void onClick(View widget) { /* do something */ }
};
mySpannable.setSpan(myClickableSpan, i1, i2 + 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);

উল্লেখ


thx @ ইমরানানা, যুক্তিযুক্ত startIndexএবং জন্য যুক্ত endIndex
রবি ভানিয়া

12

আপনি নমুনা কোড ব্যবহার করতে পারেন। আপনি ক্লিকযোগ্য স্প্যান সম্পর্কে বিস্তারিত জানতে চান। এই ডকুমেন্টেশন চেক করুন

  SpannableString myString = new SpannableString("This is example");

            ClickableSpan clickableSpan = new ClickableSpan() {
                    @Override
                    public void onClick(View textView) {
                        ToastUtil.show(getContext(),"Clicked Smile ");
                    }
                };

        //For Click
         myString.setSpan(clickableSpan,startIndex,lastIndex,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

        //For UnderLine
         myString.setSpan(new UnderlineSpan(),startIndex,lastIndex,0);

        //For Bold
        myString.setSpan(new StyleSpan(Typeface.BOLD),startIndex,lastIndex,0);

        //Finally you can set to textView. 

        TextView textView = (TextView) findViewById(R.id.txtSpan);
        textView.setText(myString);
        textView.setMovementMethod(LinkMovementMethod.getInstance());

10

স্ট্রিং থেকে কারও শুরু এবং শেষের অবস্থানের প্রয়োজনে আমি এই সহায়ক পদ্ধতিটি তৈরি করেছি made

public static TextView createLink(TextView targetTextView, String completeString,
    String partToClick, ClickableSpan clickableAction) {

    SpannableString spannableString = new SpannableString(completeString);

    // make sure the String is exist, if it doesn't exist
    // it will throw IndexOutOfBoundException
    int startPosition = completeString.indexOf(partToClick);
    int endPosition = completeString.lastIndexOf(partToClick) + partToClick.length();

    spannableString.setSpan(clickableAction, startPosition, endPosition,
        Spanned.SPAN_INCLUSIVE_EXCLUSIVE);

    targetTextView.setText(spannableString);
    targetTextView.setMovementMethod(LinkMovementMethod.getInstance());

    return targetTextView;
}

এবং আপনি এখানে এটি ব্যবহার করুন

private void initSignUp() {
    String completeString = "New to Reddit? Sign up here.";
    String partToClick = "Sign up";
    ClickableTextUtil
        .createLink(signUpEditText, completeString, partToClick,
            new ClickableSpan() {
                @Override
                public void onClick(View widget) {
                    // your action
                    Toast.makeText(activity, "Start Sign up activity",
                        Toast.LENGTH_SHORT).show();
                }

                @Override
                public void updateDrawState(TextPaint ds) {
                    super.updateDrawState(ds);
                    // this is where you set link color, underline, typeface etc.
                    int linkColor = ContextCompat.getColor(activity, R.color.blumine);
                    ds.setColor(linkColor);
                    ds.setUnderlineText(false);
                }
            });
}

স্থানীয়করণ বিবেচনায়
নেওয়ার সাথে সাথে

7
 t= (TextView) findViewById(R.id.PP1);

 t.setText(Html.fromHtml("<bThis is normal text </b>" +
                "<a href=\"http://www.xyz-zyyx.com\">This is cliclable text</a> "));
 t.setMovementMethod(LinkMovementMethod.getInstance());

2
আপনি দয়া করে আপনার উত্তর ব্যাখ্যা করতে পারেন? ব্যাখ্যা সহ উত্তর সর্বদা ভাল। আপনার কোড স্নিপেট সমস্ত সঠিক ফর্ম্যাটে নয় বলেও আমি সম্পাদনা করেছি।
পোপিয়ে

1
দেখে মনে হচ্ছে লিঙ্কটি কোনও ওয়েব পৃষ্ঠায় হবে, ওপি অনুরোধ অনুসারে কোনও ক্রিয়াকলাপের নয়।
উইলিয়াম টি। ম্যালার্ড

5

এখানে ক্লিকযোগ্য Kotlinঅংশ তৈরি করার একটি পদ্ধতি রয়েছে TextView:

private fun makeTextLink(textView: TextView, str: String, underlined: Boolean, color: Int?, action: (() -> Unit)? = null) {
    val spannableString = SpannableString(textView.text)
    val textColor = color ?: textView.currentTextColor
    val clickableSpan = object : ClickableSpan() {
        override fun onClick(textView: View) {
            action?.invoke()
        }
        override fun updateDrawState(drawState: TextPaint) {
            super.updateDrawState(drawState)
            drawState.isUnderlineText = underlined
            drawState.color = textColor
        }
    }
    val index = spannableString.indexOf(str)
    spannableString.setSpan(clickableSpan, index, index + str.length, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    textView.text = spannableString
    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.highlightColor = Color.TRANSPARENT
}

টেক্সটভিউয়ের মধ্যে বেশ কয়েকটি লিঙ্ক তৈরি করতে একে একাধিকবার বলা যেতে পারে:

makeTextLink(myTextView, str, false, Color.RED, action = { Log.d("onClick", "link") })
makeTextLink(myTextView, str1, true, null, action = { Log.d("onClick", "link1") })

3

ফান ভ্যান লিনহের উত্তরটির কোটলিন সংস্করণ

দয়া করে মনে রাখবেন এটিতে কিছু ছোটখাটো পরিবর্তন রয়েছে।

fun makeLinks(textView: TextView, links: Array<String>, clickableSpans: Array<ClickableSpan>) {
    val spannableString = SpannableString(textView.text)

    for (i in links.indices) {
        val clickableSpan = clickableSpans[i]
        val link = links[i]

        val startIndexOfLink = textView.text.indexOf(link)

        spannableString.setSpan(clickableSpan, startIndexOfLink, startIndexOfLink + link.length,
                Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    }

    textView.movementMethod = LinkMovementMethod.getInstance()
    textView.setText(spannableString, TextView.BufferType.SPANNABLE)
}

fun setupClickableTextView() {
    val termsOfServicesClick = object : ClickableSpan() {
        override fun onClick(p0: View?) {
            Toast.makeText(applicationContext, "ToS clicked", Toast.LENGTH_SHORT).show()
        }
    }

    val privacyPolicyClick = object : ClickableSpan() {
        override fun onClick(p0: View?) {
            Toast.makeText(applicationContext, "PP clicked", Toast.LENGTH_SHORT).show()
        }
    }

    makeLinks(termsTextView, arrayOf("terms", "privacy policy"), arrayOf(termsOfServicesClick, privacyPolicyClick))
}

1

সাহসের জন্য,

mySpannable.setSpan(new StyleSpan(Typeface.BOLD),termStart,termStop,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

1

আমি একটি ভিন্ন পদ্ধতির পরামর্শ দেব যা আমার ধারণা কম কোডের প্রয়োজন এবং এটি আরও "স্থানীয়করণ-বান্ধব"।

মনে করুন যে আপনার গন্তব্য ক্রিয়াকলাপটিকে "অ্যাক্টিভিটিস্ট্যাক" বলা হয়, ম্যানিফেস্টে এটির জন্য অ্যানড্রয়েড ম্যানিফেস্ট.এক্সএমএলে একটি কাস্টম স্কিম (উদাহরণস্বরূপ "মাইপস্কেম") দিয়ে একটি ইন্টেন্ট ফিল্টার সংজ্ঞায়িত করুন:

<activity
    android:name=".ActivityStack">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />
        <category android:name="android.intent.category.DEFAULT" />
        <data android:host="stack"/>
        <data android:scheme="myappscheme" />
    </intent-filter>
</activity>

কোনও বিশেষ ট্যাগ ছাড়াই টেক্সটভিউকে সংজ্ঞায়িত করুন ("অ্যান্ড্রয়েড: অটোলিঙ্ক" ট্যাগটি ব্যবহার না করা গুরুত্বপূর্ণ, দেখুন: https://stackoverflow.com/a/20647011/1699702 ):

<TextView
    android:id="@+id/stackView"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="@string/stack_string" />

তারপরে কাস্টম স্কিমের সাথে একটি লিঙ্ক এবং টেক্সটভিউয়ের পাঠ্যে হোস্টটি স্ট্রিং.এক্সএমএল হিসাবে ব্যবহার করুন:

<string name="stack_string">Android is a Software <a href="myappscheme://stack">stack</a></string>

এবং setMovementMethod () এর সাথে লিঙ্কটি (সক্রিয় করুন) (ক্রিয়াকলাপের জন্য onCreate () বা টুকরাগুলির জন্য onCreateView ()):

TextView stack = findViewById(R.id.stackView);
stack.setMovementMethod(LinkMovementMethod.getInstance());

এটি "স্ট্যাক" শব্দটিতে একটি আলতো চাপ দিয়ে স্ট্যাক ক্রিয়াকলাপটি খুলবে।


0

ক্লিকযোগ্যযোগ্য মান সেট করতে আপনি এই পদ্ধতিটি করতে পারেন

public void setClickableString(String clickableValue, String wholeValue, TextView yourTextView){
    String value = wholeValue;
    SpannableString spannableString = new SpannableString(value);
    int startIndex = value.indexOf(clickableValue);
    int endIndex = startIndex + clickableValue.length();
    spannableString.setSpan(new ClickableSpan() {
                                @Override
                                public void updateDrawState(TextPaint ds) {
                                    super.updateDrawState(ds);
                                    ds.setUnderlineText(false); // <-- this will remove automatic underline in set span
                                }

                                @Override
                                public void onClick(View widget) {
                                    // do what you want with clickable value
                                }
                            }, startIndex, endIndex, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
    yourTextView.setText(spannableString);
    yourTextView.setMovementMethod(LinkMovementMethod.getInstance()); // <-- important, onClick in ClickableSpan won't work without this
}

এটি এটি কীভাবে ব্যবহার করবেন:

TextView myTextView = findViewById(R.id.myTextView);
setClickableString("stack", "Android is a Software stack", myTextView);

0

MovementMethodলিঙ্ক / পাঠ্য / চিত্র ক্লিকগুলি সনাক্ত করার জন্য এটি আমার । এটি পরিবর্তন করা হয়েছে LinkMovementMethod

import android.text.Layout;
import android.text.NoCopySpan;
import android.text.Selection;
import android.text.Spannable;
import android.text.method.ScrollingMovementMethod;
import android.text.style.ClickableSpan;
import android.text.style.ImageSpan;
import android.text.style.URLSpan;
import android.view.KeyEvent;
import android.view.MotionEvent;
import android.view.View;
import android.widget.TextView;

public class ClickMovementMethod extends ScrollingMovementMethod {
private Object FROM_BELOW = new NoCopySpan.Concrete();

private static final int CLICK = 1;
private static final int UP = 2;
private static final int DOWN = 3;

private Listener listener;

public void setListener(Listener listener) {
    this.listener = listener;
}

@Override
public boolean canSelectArbitrarily() {
    return true;
}

@Override
protected boolean handleMovementKey(TextView widget, Spannable buffer, int keyCode,
                                    int movementMetaState, KeyEvent event) {
    switch (keyCode) {
        case KeyEvent.KEYCODE_DPAD_CENTER:
        case KeyEvent.KEYCODE_ENTER:
            if (KeyEvent.metaStateHasNoModifiers(movementMetaState)) {
                if (event.getAction() == KeyEvent.ACTION_DOWN &&
                        event.getRepeatCount() == 0 && action(CLICK, widget, buffer)) {
                    return true;
                }
            }
            break;
    }
    return super.handleMovementKey(widget, buffer, keyCode, movementMetaState, event);
}

@Override
protected boolean up(TextView widget, Spannable buffer) {
    if (action(UP, widget, buffer)) {
        return true;
    }

    return super.up(widget, buffer);
}

@Override
protected boolean down(TextView widget, Spannable buffer) {
    if (action(DOWN, widget, buffer)) {
        return true;
    }

    return super.down(widget, buffer);
}

@Override
protected boolean left(TextView widget, Spannable buffer) {
    if (action(UP, widget, buffer)) {
        return true;
    }

    return super.left(widget, buffer);
}

@Override
protected boolean right(TextView widget, Spannable buffer) {
    if (action(DOWN, widget, buffer)) {
        return true;
    }

    return super.right(widget, buffer);
}

private boolean action(int what, TextView widget, Spannable buffer) {
    Layout layout = widget.getLayout();

    int padding = widget.getTotalPaddingTop() +
            widget.getTotalPaddingBottom();
    int areatop = widget.getScrollY();
    int areabot = areatop + widget.getHeight() - padding;

    int linetop = layout.getLineForVertical(areatop);
    int linebot = layout.getLineForVertical(areabot);

    int first = layout.getLineStart(linetop);
    int last = layout.getLineEnd(linebot);

    ClickableSpan[] candidates = buffer.getSpans(first, last, URLSpan.class);

    int a = Selection.getSelectionStart(buffer);
    int b = Selection.getSelectionEnd(buffer);

    int selStart = Math.min(a, b);
    int selEnd = Math.max(a, b);

    if (selStart < 0) {
        if (buffer.getSpanStart(FROM_BELOW) >= 0) {
            selStart = selEnd = buffer.length();
        }
    }

    if (selStart > last)
        selStart = selEnd = Integer.MAX_VALUE;
    if (selEnd < first)
        selStart = selEnd = -1;

    switch (what) {
        case CLICK:
            if (selStart == selEnd) {
                return false;
            }

            if (listener != null) {
                URLSpan[] link = buffer.getSpans(selStart, selEnd, URLSpan.class);
                if (link.length >= 1) {
                    listener.onClick(link[0].getURL());
                } else {
                    ImageSpan[] image = buffer.getSpans(selStart, selEnd, ImageSpan.class);
                    if (image.length >= 1) {
                        listener.onImageClicked(image[0].getSource());
                    } else {
                        listener.onTextClicked();
                    }
                }
            }
            break;

        case UP:
            int beststart, bestend;

            beststart = -1;
            bestend = -1;

            for (int i = 0; i < candidates.length; i++) {
                int end = buffer.getSpanEnd(candidates[i]);

                if (end < selEnd || selStart == selEnd) {
                    if (end > bestend) {
                        beststart = buffer.getSpanStart(candidates[i]);
                        bestend = end;
                    }
                }
            }

            if (beststart >= 0) {
                Selection.setSelection(buffer, bestend, beststart);
                return true;
            }

            break;

        case DOWN:
            beststart = Integer.MAX_VALUE;
            bestend = Integer.MAX_VALUE;

            for (int i = 0; i < candidates.length; i++) {
                int start = buffer.getSpanStart(candidates[i]);

                if (start > selStart || selStart == selEnd) {
                    if (start < beststart) {
                        beststart = start;
                        bestend = buffer.getSpanEnd(candidates[i]);
                    }
                }
            }

            if (bestend < Integer.MAX_VALUE) {
                Selection.setSelection(buffer, beststart, bestend);
                return true;
            }

            break;
    }

    return false;
}

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

        URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);

        if (action == MotionEvent.ACTION_UP) {
            if (listener != null) {
                if (link.length >= 1) {
                    listener.onClick(link[0].getURL());
                } else {
                    ImageSpan[] image = buffer.getSpans(off, off, ImageSpan.class);
                    if (image.length >= 1) {
                        listener.onImageClicked(image[0].getSource());
                    } else if (Selection.getSelectionStart(buffer) == Selection.getSelectionEnd(buffer)) {
                        listener.onTextClicked();
                    }
                }
            }
        }

        if (action == MotionEvent.ACTION_DOWN && link.length != 0) {
            Selection.setSelection(buffer,
                    buffer.getSpanStart(link[0]),
                    buffer.getSpanEnd(link[0]));
            return true;
        }

        if (link.length == 0) {
            Selection.removeSelection(buffer);
        }
    }

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

@Override
public void initialize(TextView widget, Spannable text) {
    Selection.removeSelection(text);
    text.removeSpan(FROM_BELOW);
}

@Override
public void onTakeFocus(TextView view, Spannable text, int dir) {
    Selection.removeSelection(text);

    if ((dir & View.FOCUS_BACKWARD) != 0) {
        text.setSpan(FROM_BELOW, 0, 0, Spannable.SPAN_POINT_POINT);
    } else {
        text.removeSpan(FROM_BELOW);
    }
}

public interface Listener {

    void onClick(String clicked);

    void onTextClicked();

    void onImageClicked(String source);

}

}

0

কোটলিনে আরও জেনেরিক উত্তর

   fun setClickableText(view: TextView, firstSpan: String, secondSpan: String) {
    val context = view.context
    val builder = SpannableStringBuilder()
    val unClickableSpan = SpannableString(firstSpan)
    val span = SpannableString(" "+secondSpan)

    builder.append(unClickableSpan);
    val clickableSpan: ClickableSpan = object : ClickableSpan() {
        override fun onClick(textView: View) {
            val intent = Intent(context, HomeActivity::class.java)
         context.startActivity(intent)
        }

        override fun updateDrawState(ds: TextPaint) {
            super.updateDrawState(ds)
            ds.isUnderlineText = true
            ds.setTypeface(Typeface.create(Typeface.DEFAULT, Typeface.ITALIC));
        }
    }
    builder.append(span);
    builder.setSpan(clickableSpan, firstSpan.length, firstSpan.length+secondSpan.length+1, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)

    view.setText(builder,TextView.BufferType.SPANNABLE)
    view.setMovementMethod(LinkMovementMethod.getInstance());


}

0

একটি পাঠ্য দৃশ্যে একটি লিঙ্কযুক্ত পাঠ্য যুক্ত করতে, আপনি নীচে "পাদচরণ_পাঠ্য" স্ট্রিং সংস্থান উদাহরণ ব্যবহার করতে পারেন এবং আপনার ক্রিয়াকলাপের জন্য আপনার অনক্রিট পদ্ধতিটি সম্পাদনা করতে পারেন, আপনি নীচের উদাহরণটি ব্যবহার করতে পারেন

string.xml

<?xml version="1.0" charset="utf-8"?>
<resources>
     <string name="app_name">Name of My Application</string>

    <string name="footer_text">
        <a href="https://www.google.com/tos">Terms of Service</a>
        <a href="https://www.google.com/contact">Contact</a>
        <a href="https://www.google.com/privacy">Privacy Policy</a>
    </string>
</resources>

MainActivity.java

...

@Override
public void onCreate(Bundle savedInstance) {
    super.onCreate(savedInstance);
    setContentView(R.layout.activity_main);

    TextView textView = findViewById(R.id.textViewLink);
    textView.setMovementMethod(LinkMovermentMethod.getInstance());
}

....

0

প্রদত্ত সমাধানগুলি বেশ শালীন। তবে, আমি সাধারণত আরও সহজ সমাধান ব্যবহার করি।

এখানে একটি লিঙ্কাইফাই ইউটিলিটি ফাংশন

/**
 * Method is used to Linkify words in a TextView
 *
 * @param textView TextView who's text you want to change
 * @param textToLink The text to turn into a link
 * @param url   The url you want to send the user to
 */
fun linkify(textView: TextView, textToLink: String, url: String) {
    val pattern = Pattern.compile(textToLink)
    Linkify.addLinks(textView, pattern, url, { _, _, _ -> true })
    { _, _ -> "" }
}

এই ফাংশনটি ব্যবহার করা বেশ সহজ। এখানে একটি উদাহরণ

    // terms and privacy
    val tvTerms = findViewById<TextView>(R.id.tv_terms)
    val tvPrivacy = findViewById<TextView>(R.id.tv_privacy)
    Utils.linkify(tvTerms, resources.getString(R.string.terms),
            Constants.TERMS_URL)
    Utils.linkify(tvPrivacy, resources.getString(R.string.privacy),
            Constants.PRIVACY_URL)

0

আপনার প্রশ্নটি কোটলিনে সমাধান করার জন্য আমি একটি উদাহরণ দিয়েছি।

এটি কোড:

    val completeText = getString(R.string.terms_description)
    val textToFind = getString(R.string.show_terms)
    val spannableString: Spannable = SpannableString(completeText)
    val startFocus = completeText.indexOf(textToFind)
    val endFocus = startFocus + textToFind.length

    spannableString.setSpan(object: ClickableSpan() {
        override fun onClick(p0: View) {
            showMessage()
        }
    }, startFocus, endFocus, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE)
    show_terms.text = spannableString
    show_terms.movementMethod = LinkMovementMethod.getInstance();
    show_terms.highlightColor = Color.TRANSPARENT;

এটি এক্সএমএল

    <CheckBox
            android:id="@+id/check_agree_terms"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>

    <TextView
            android:id="@+id/show_terms"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textColorLink="@color/colorPrimary"
            android:layout_toEndOf="@id/check_agree_terms"/>

এই এটা দেখায় কিভাবে হয়

এখানে চিত্র বর্ণনা লিখুন


-1

পাঠ্যের কিছু অংশের জন্য ক্লিকযোগ্য অংশের জন্য এটি সত্যই সহায়ক।

নিয়মিত প্রকাশের জন্য বিন্দুটি একটি বিশেষ চরিত্র। আপনি যদি বিস্তৃত করতে চান তবে বিন্দু হিসাবে পালাতে হবে \\। কেবল " ." প্রসারিত পাঠ্য পদ্ধতিতে পাস করার পরিবর্তে । বিকল্পভাবে, আপনি [.]জাভাতে কোনও বিন্দুর মাধ্যমে স্ট্রিংকে প্রশমিত করতে নিয়মিত এক্সপ্রেশনটিও ব্যবহার করতে পারেন ।

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