web-dev-qa-db-fra.com

word cliquable à l'intérieur de TextView dans Android

J'ai TextView avec du texte qui a changé dynamiquement. Ce texte contient des chaînes telles que <a href='myWord'>myWord</a>. Je veux qu'après avoir cliqué sur ce "lien", mon mot apparaisse dans le texte d'édition dans la même activité.

Ceci est mon code:

txt.setText(Html.fromHtml("...<a href='link'>link</a>..."));
txt.setMovementMethod(LinkMovementMethod.getInstance());

Cela fonctionne bien pour les URL dans l'attribut href, mais il existe une erreur pour un autre format.

J'ai trouvé beaucoup de questions similaires sur StackOverflow mais toutes concernaient des liens URL. Dans mon application, je veux créer un "lien" dans l'activité. En général, je peux changer de tag pour un autre si cela dépend ...

S'il vous plaît, aidez-moi! Merci!

----- RESOLU ----- Merci Jacob Phillips pour l'idée!

Puisse quelqu'un intéresser à l'avenir. Ceci est un code:

//This is my string;
String str = "<b>Text</b> which contains one <a href='#'>link</a> and another <a href='#'>link</a>";
//TextView;
TextView txt = new TextView(this);
//Split string to parts:                                        
String[] devFull = data[v.getId()][1].split("<a href='#'>");
//Adding first part:
txt.append(Html.fromHtml(devFull[0]));
//Creating array for parts with links (they amount always will devFull.length-1):
SpannableString[] link = new SpannableString[devFull.length-1];
//local vars:
ClickableSpan[] cs = new ClickableSpan[devFull.length-1];
String linkWord;
String[] devDevFull = new String[2];

for(int i=1; i<devFull.length; i++){
    //obtaining 'clear' link
    devDevFull = devFull[i].split("</a>");
    link[i-1] = new SpannableString(devDevFull[0]);
    linkWord = devDevFull[0];
    cs[i-1] = new ClickableSpan(){
        private String w = linkWord;
        @Override
        public void onClick(View widget) {
            // here you can use w (linkWord)
        }
    };
    link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0);
    txt.append(link[i-1]);
    try{
        txt.append(Html.fromHtml(devDevFull[1]));
    }
    catch(Exception e){}
}
29
lubart

Cela devrait faire l'affaire. Il suffit de changer le texte de votre edittext dans la OnClickListener. Il peut peut-être être réduit mais cela devrait marcher.

private void foo() {
    SpannableString link = makeLinkSpan("click here", new View.OnClickListener() {          
        @Override
        public void onClick(View v) {
            // respond to click
        }
    });

    // We need a TextView instance.        
    TextView tv = new TextView(context);   

    // Set the TextView's text     
    tv.setText("To perform action, ");

    // Append the link we created above using a function defined below.
    tv.append(link);

    // Append a period (this will not be a link).
    tv.append(".");

    // This line makes the link clickable!
    makeLinksFocusable(tv);
}

/*
 * Methods used above.
 */

private SpannableString makeLinkSpan(CharSequence text, View.OnClickListener listener) {
    SpannableString link = new SpannableString(text);
    link.setSpan(new ClickableString(listener), 0, text.length(), 
        SpannableString.SPAN_INCLUSIVE_EXCLUSIVE);
    return link;
}

private void makeLinksFocusable(TextView tv) {
    MovementMethod m = tv.getMovementMethod();  
    if ((m == null) || !(m instanceof LinkMovementMethod)) {  
        if (tv.getLinksClickable()) {  
            tv.setMovementMethod(LinkMovementMethod.getInstance());  
        }  
    }  
}

/*
 * ClickableString class 
 */

private static class ClickableString extends ClickableSpan {  
    private View.OnClickListener mListener;          
    public ClickableString(View.OnClickListener listener) {              
        mListener = listener;  
    }          
    @Override  
    public void onClick(View v) {  
        mListener.onClick(v);  
    }        
}
43
Jacob Phillips

Une meilleure approche est

   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));
        }
    };
    ss.setSpan(clickableSpan, 22, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
//where 22 and 27 are the starting and ending index of the String. Now Word stack is clickable 
// onClicking stack it will open NextActiivty

    TextView textView = (TextView) findViewById(R.id.hello);
    textView.setText(ss);
    textView.setMovementMethod(LinkMovementMethod.getInstance());
12
Xar E Ahmer

Vous pouvez utiliser le code ci-dessous;

 SpannableString myString = new SpannableString(Html.fromHtml("Please "+"<font color=\"#F15d36\"><u>"+"login"+"</u></font>" +" or "+ "<font color=\"#F15d36\"><u>"+"sign up"+ "</u></font>"+" to begin your YupIT experience"));

        ClickableSpan clickableSpan = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                Toast.makeText(getContext(),"dfsgvdfs",Toast.LENGTH_SHORT).show();
            }
        };

        ClickableSpan clickableSpan1 = new ClickableSpan() {
            @Override
            public void onClick(View textView) {
                Toast.makeText(getContext(),"dfsgvdfs",Toast.LENGTH_SHORT).show();
            }
        };

        myString.setSpan(clickableSpan,6,12,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        myString.setSpan(clickableSpan1,15,23,Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);

        myString.setSpan(new ForegroundColorSpan(Color.parseColor("#F15d36")),6, 12, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        myString.setSpan(new ForegroundColorSpan(Color.parseColor("#F15d36")),15,23, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);


        tvFound.setMovementMethod(LinkMovementMethod.getInstance());
        tvFound.setText(myString);
0
Vishal Vaishnav

Pour donner une réponse complète en mélangeant les réponses;

private void textAreaInit()
{
    String str = "<a href='#'>Link 1</a> and <a href='#'>Link2</a> is here.";

    TextView tv = mConfirmText;  
    String[] devFull = str.split("<a href='#'>");


    tv.append(Html.fromHtml(devFull[0]));

    SpannableString[] link = new SpannableString[devFull.length-1];

    ClickableSpan[] cs = new ClickableSpan[devFull.length-1];
    String linkWord;
    String[] devDevFull = new String[2];

    for(int i=1; i<devFull.length; i++)
    {
        //obtaining 'clear' link
        devDevFull = devFull[i].split("</a>");
        link[i-1] = new SpannableString(devDevFull[0]);
        linkWord = devDevFull[0];
        final String a = linkWord;
        cs[i-1] = new ClickableSpan()
        { 
            private String w = a;
            @Override
            public void onClick(View widget) {

                if(w.equals("Link 1"))
                {
                    Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class);
                    intent.putExtra("title", "Link1");
                    intent.putExtra("uri", "link1");
                    intent.putExtra("type", "1");
                    startActivity(intent);
                }
                else
                {
                    Intent intent = new Intent(PrintPropertiesActivity.this, ViewerAcivity.class);
                    intent.putExtra("title", "Link2");
                    intent.putExtra("uri", "link2");
                    intent.putExtra("type", "2");
                    startActivity(intent);
                }
            }
        };
        link[i-1].setSpan(cs[i-1], 0, linkWord.length(), 0);
        tv.append(link[i-1]);
        try{
            tv.append(Html.fromHtml(devDevFull[1]));
        }
        catch(Exception e){}
    }


    makeLinksFocusable(tv);
}

private void makeLinksFocusable(TextView tv) {
    MovementMethod m = tv.getMovementMethod();  
    if ((m == null) || !(m instanceof LinkMovementMethod)) {  
        if (tv.getLinksClickable()) {  
            tv.setMovementMethod(LinkMovementMethod.getInstance());  
        }  
    }  
}
0
Berkay Turancı

La meilleure solution que je connaisse consiste à créer votre propre classe Button. Vous pouvez faire en sorte que le bouton ait un arrière-plan transparent afin que seul le texte soit vu par l'utilisateur. Ensuite, lorsque le bouton est enfoncé, changez les couleurs TextColor et TextStyle du bouton afin qu’elles soient plus foncées et soulignées. Cela fonctionnera exactement comme un lien. Vous pouvez ensuite utiliser startActivity pour accéder à l'activité appropriée. Vous ne devez pas utiliser d'hyperliens pour vous connecter à d'autres activités au sein de votre application.

Mon opinion personnelle serait de faire une deuxième textview contenant le texte que vous voulez être votre lien. Ensuite, vous pouvez faire votre action dans le onClick de cette seconde textView. Également, comme zzzzzzzzzzz l'a indiqué ci-dessus, vous pouvez choisir de modifier les propriétés de la police de ce texte comme vous le souhaitez une fois que vous l'avez cliqué.

0
testingtester