seterror - textview android link click




Come faccio a fare clic su collegamenti in un TextView? (20)

Ho definito il seguente TextView:

<TextView android:layout_width="wrap_content"
    android:layout_height="wrap_content" android:text="@string/txtCredits"
    android:autoLink="web" android:id="@+id/infoTxtCredits"
    android:layout_centerInParent="true"
    android:linksClickable="true"></TextView>

dove @string/txtCredits è una risorsa stringa che contiene <a href="some site">Link text</a> .

Android sta evidenziando i collegamenti in TextView, ma non rispondono ai clic. Qualcuno può dirmi cosa sto sbagliando? Devo impostare un onClickListener per TextView nella mia attività per qualcosa di così semplice?

Sembra che abbia a che fare con il modo in cui definisco la mia risorsa stringa. Questo non funziona:

<string name="txtCredits"><a href="http://www.google.com">Google</a></string>

Ma questo:

<string name="txtCredits">www.google.com</string>

Il che è un peccato perché preferirei mostrare un link testuale piuttosto che mostrare l'URL completo.


Aggiungi CDATA alla tua risorsa stringa

strings.xml

<string name="txtCredits"><![CDATA[<a href=\"http://www.google.com\">Google</a>]]></string>

Assicurarsi di non utilizzare setAutoLinkMask(Linkify.ALL) quando si utilizza setMovementMethod(LinkMovementMethod.getInstance()) e Html.fromHTML() su collegamenti HTML formattati correttamente (ad esempio, <a href="http://www.google.com/">Google</a> ).


Ecco come ho risolto i collegamenti cliccabili e visibili in una TextView (per codice)

private void setAsLink(TextView view, String url){
        Pattern pattern = Pattern.compile(url);
        Linkify.addLinks(view, pattern, "http://");
        view.setText(Html.fromHtml("<a href='http://"+url+"'>http://"+url+"</a>"));
    }

Ecco un codice Android di una sola riga per rendere il telefono e l'url selezionabili da textView, indipendentemente dalla stringa e dai dati. Non è necessario utilizzare alcun tag HTML per questo.

TextView textView = (TextView)findViewById(R.id.textView1);
textView.setText("some url is www.google.com phone 7504567890 another url lkgndflg.com ");

// Makes the textView's Phone and URL (hyperlink) select and go.
Linkify.addLinks(textView, Linkify.WEB_URLS | Linkify.PHONE_NUMBERS);

Ho aggiunto questa linea a TextView : android:autoLink="web"
Di seguito è riportato un esempio di utilizzo in un file di layout.

esempio layout.xml

    <TextView
        android:id="@+id/txtLostpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="email"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/lostpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

    <TextView
        android:id="@+id/txtDefaultpassword"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:autoLink="web"
        android:gravity="center"
        android:padding="20px"
        android:text="@string/defaultpassword"
        android:textAppearance="?android:attr/textAppearanceSmall" />

string.xml

<string name="lostpassword">If you lost your password please contact <a href="mailto:[email protected]?Subject=Lost%20Password" target="_top">[email protected]</a></string>

<string name="defaultpassword">User Guide <a href="http://www.cleverfinger.com.au/user-guide/">http://www.cleverfinger.com.au/user-guide/</a></string>

Ho appena perso così tanto tempo per capire che devi usare getText (R.string.whatever) invece di getString (R.string.whatever) ...

Ad ogni modo, ecco come ho ottenuto il mio lavoro. Con più collegamenti ipertestuali nella stessa vista di testo.

    TextView termsTextView = (TextView) getActivity().findViewById(R.id.termsTextView);
    termsTextView.append("By registering your account, you agree to our ");
    termsTextView.append(getText(R.string.terms_of_service));
    termsTextView.append(", ");
    termsTextView.append(getText(R.string.fees));
    termsTextView.append(", and the ");
    termsTextView.append(getText(R.string.stripe_connected_account_agreement));

    termsTextView.setMovementMethod(LinkMovementMethod.getInstance());



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

esempio di stringa

    <string name="stripe_connected_account_agreement"><a href="https://stripe.com/connect/account-terms">Stripe Connected Account Agreement</a></string>

Il mio codice era così:

<TextView
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:id="@+id/link"
    android:text="@string/forgot"
    android:layout_marginTop="16dp"
    android:gravity="center"
    android:linksClickable="true"/>

Il mio codice Java era così:

/*TextView action*/
        TextView textView = (TextView) findViewById(R.id.link);
        textView.setMovementMethod(LinkMovementMethod.getInstance());
        textView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                startActivity(new Intent(LoginActivity.this,forgot.class));
            }
        });  

Questo indica solo il collegamento a un'altra attività. Ma quel link è cliccabile e funziona senza intoppi. Testato su Android Studio 1.5 (Anteprima)


Il motivo per cui stai riscontrando il problema è che cerca solo di abbinare gli indirizzi "nudi". cose come "www.google.com" o " http://www.google.com ".

Esecuzione del testo tramite Html.fromHtml() dovrebbe fare il trucco. Devi farlo programmaticamente, ma funziona.


Il telefono Autolink non ha funzionato per me. Il seguente ha funzionato come un fascino,

TextView tv = (TextView) findViewById(R.id.emergencynos);
String html2="<br><br>Fire - <b><a href=tel:997>997</a> </b></br></br>";        
tv.append(Html.fromHtml(html2));
tv.setMovementMethod(LinkMovementMethod.getInstance());

La cosa più semplice che ha funzionato per me è usare here

TextView txt_Message = (TextView) view.findViewById(R.id.txt_message);
txt_Message.setText("This is link https://www.google.co.in/");
Linkify.addLinks(txt_Message, Linkify.WEB_URLS);

e rileverà automaticamente gli URL web dal testo nella vista testo.


Le soluzioni di cui sopra non hanno funzionato per me, ma quanto segue (e sembra un po 'più pulito).
Innanzitutto, nella risorsa stringa, definisci i tag che aprono le frecce utilizzando la codifica dell'entità HTML, ad esempio:

&lt;a href="http://www.google.com">Google&lt;/a>

e non:

<a href="http://www.google.com">Google</a>

In generale, codifica tutti i galloni nella stringa in questo modo. A proposito, il collegamento deve iniziare con http://

Quindi (come suggerito here ) imposta questa opzione sul tuo TextView:

 android:linksClickable="true"

Infine, nel codice, fai:

((TextView) findViewById(R.id.your_text_view)).setMovementMethod(LinkMovementMethod.getInstance());
((TextView) findViewById(R.id.your_text_view)).setText(Html.fromHtml(getResources().getString(R.string.string_with_links)));

È tutto, non sono richieste regex o altri hack manuali.


Non so se vale la pena aggiungere un'altra risposta, ma nel caso in cui ...

Ho dovuto cacciarlo in un paio di posti, ma alla fine ho ottenuto questa versione del codice per funzionare.

strings.xml:

<string name="name1">&lt;a href="http://www.google.com">link text1&lt;/a></string>
<string name="name2">&lt;a href="http://www.google.com">link text2&lt;/a></string>

myactivity.xml:

<TextView 
    android:id="@+id/textview1"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

<TextView 
    android:id="@+id/textview2"
    android:layout_height="wrap_content"
    android:layout_width="wrap_content"
    android:layout_marginTop="5dp" />

myactivty.java (in onCreate ()):

TextView tv1 = (TextView)findViewById(R.id.textview1);
TextView tv2 = (TextView)findViewById(R.id.textview2);

tv1.setText(Html.fromHtml(getResources().getString(R.string.name1)));
tv2.setText(Html.fromHtml(getResources().getString(R.string.name2)));
tv1.setMovementMethod(LinkMovementMethod.getInstance());
tv2.setMovementMethod(LinkMovementMethod.getInstance());

Questo creerà due hyperlink cliccabili con il testo text link text1 e link text2 che reindirizzerà l'utente a google.


Se utilizzi TextView basato su XML, per le tue necessità devi fare solo due cose:

  1. Identifica il tuo link nella stringa, ad esempio "questa è la mia pagina web". Puoi aggiungerlo in xml o nel codice.

  2. Nel xml che ha il TextView, aggiungi questi:


android:linksClickable="true"

android:autoLink="web"

Se vuoi aggiungere un link simile a HTML, tutto ciò che devi fare è:

  • aggiungi una stringa HTML simile a una risorsa:

     <string name="link"><a href="https://www.google.pl/">Google</a></string>
    
  • aggiungi la tua vista al layout con NESSUNA configurazione specifica per il collegamento affatto:

     <TextView
        android:id="@+id/link"
        android:text="@string/link" />`
    
  • aggiungi MovementMethod appropriato al tuo TextView a livello di codice:

     mLink = (TextView) findViewById(R.id.link);
     if (mLink != null) {
       mLink.setMovementMethod(LinkMovementMethod.getInstance());
     }
    

Questo è tutto! E sì, avere opzioni come "autoLink" e "linksClickable" che funzionano solo su collegamenti espliciti (non racchiuse in tag html) è molto fuorviante anche per me ...


Solo ciò di cui hai bisogno per aggiungere questo in visualizzazione testo in xml

<TextView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:autoLink="web"/>

Sto usando solo android:autoLink="web" e funziona bene. Un clic sul collegamento apre il browser e mostra la pagina corretta.

Una cosa che posso indovinare è che qualche altra vista è al di sopra del collegamento. Qualcosa che è trasparente riempie l'intero genitore ma non visualizza nulla sopra il link. In questo caso il clic va a questa vista anziché al link.


Usa sotto il codice:

String html = "<a href=\"http://yourdomain.com\">Your Domain Name</a>"
TextView textview = (TextView) findViewById(R.id.your_textview_id);
textview.setMovementMethod(LinkMovementMethod.getInstance());
textview.setText(Html.fromHtml(html));

Uso l'autolink per "evidenziare automaticamente" il testo, ma ho appena creato un "onClick" che lo gestisce. (Mi sono imbattuto in questo problema me stesso)

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:textSize="18dp"
            android:autoLink="all"
            android:text="@string/twitter"
            android:onClick="twitter"/>

public void twitter (View view)
    {
        try
        {
            Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("http://twitter.com/onaclovtech"));
            startActivity(browserIntent);

        }
        finally
        {
        }
    }

Non richiede alcuna autorizzazione, poiché stai passando l'intento alle app che gestiscono tali risorse, (browser IE).

Questo è quello che ha funzionato per me. In bocca al lupo.


[Tested in Pre-lollipop as well as in Lollipop and above]

È possibile ottenere la stringa HTML dal back-end o dai file delle risorse. Se inserisci il tuo testo come una stringa di risorse, assicurati di aggiungere il tag CDATA :

<string name="your_text">![CDATA[...<a href="your_link">Link Title</a>  ...]]</string>

Quindi nel codice è necessario ottenere la stringa e assegnarla come HTML e impostare un metodo di spostamento del collegamento:

String yourText = getString(R.string.your_text);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
   textView.setText(Html.fromHtml(yourText, Html.FROM_HTML_MODE_COMPACT));
} else {
   textView.setText(Html.fromHtml(yourText));
}

try {
   subtext.setMovementMethod(LinkMovementMethod.getInstance());
} catch (Exception e) {
   //This code seems to crash in some Samsung devices.
   //You can handle this edge case base on your needs.
}

Spero che questo ti possa aiutare;

String value = "<html>Visit my blog <a href=\"http://www.maxartists.com\">mysite</a> View <a href=\"sherif-activity://myactivity?author=sherif&nick=king\">myactivity</a> callback</html>";
    TextView text = (TextView) findViewById(R.id.text);


    text.setText(Html.fromHtml(value));
    text.setMovementMethod(LinkMovementMethod.getInstance());




clickable