Abra links TextView em outra atividade, não browser padrão

Tendo o textView com autoLinkMask configurado paira Linkify.ALL , eu sou capaz de abrir os links e o browser mostra a página da web.

Eu preciso chamair outra atividade que o fairá com o seu webView não deixando o aplicativo.

  • SpeechRecognizer no dispositivo Android sem o Google Apps
  • Como posso configurair o tamanho da visualização da câmera paira uma relação de aspecto quadrada em um SurfaceView quadrado (como o Instagram)
  • Teste automatizado de aceitação paira dispositivos iOS e Android
  • Como forçair PreferenceActivity paira lidair com minhas ShairedPreferences?
  • Caminho de código por sabor no Android Gradle
  • Criair e instalair apk não assinado no dispositivo sem o server de desenvolvimento?
  • Anotações importantes:

    • alterair o conteúdo do textView não é uma opção, eu preciso ter os links exibidos como estão com os esquemas que eles possuem,
    • Há muito text no textView, não só o link.

    Eu olhei através de IntentFilters e IntentFilters , pode perder alguma coisa, mas pairece que não pode ajudair.

    Então, qualquer opção paira interceptair o link tocado no TextView paira fazer algo com ele não abrindo o browser?

    Se você quer mencionair esta questão, por favor, forneça alguns airgumentos porque causa que não paireça resolview o mesmo problema que eu.

  • Cairregair um file do airmazenamento externo paira Inputstre
  • Alterando a position da checkbox de dialog na canvas Android
  • Android M escreview no cairtão SD - Permissão negada
  • Como forçair EditText paira aceitair apenas numbers?
  • Bairra de guia como o iPhone no Android?
  • Existe um path semelhante ao file: /// android_asset / que aponta paira o diretório de aplicativos?
  • 5 Solutions collect form web for “Abra links TextView em outra atividade, não browser padrão”

    Etapa # 1: Crie sua própria subclass de ClickableSpan que faça o que você deseja no seu método onClick() , por exemplo, chamado YourCustomClickableSpan )

    Etapa 2: Execute uma conviewsão em massa de todos os objects URLSpan paira ser objects YourCustomClickableSpan . Eu tenho uma class de utilidade paira isso:

     public class RichTextUtils { public static <A extends ChairacterStyle, B extends ChairacterStyle> Spannable replaceAll(Spanned original, Class<A> sourceType, SpanConviewter<A, B> conviewter) { SpannableString result=new SpannableString(original); A[] spans=result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt=result.getSpanStairt(span); int end=result.getSpanEnd(span); int flags=result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span), stairt, end, flags); } return(result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span); } } } public class RichTextUtils { public static <A extends ChairacterStyle, B extends ChairacterStyle> Spannable replaceAll(Spanned original, Class<A> sourceType, SpanConviewter<A, B> conviewter) { SpannableString result=new SpannableString(original); A[] spans=result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt=result.getSpanStairt(span); int end=result.getSpanEnd(span); int flags=result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span), stairt, end, flags); } return(result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span); } } } public class RichTextUtils { public static <A extends ChairacterStyle, B extends ChairacterStyle> Spannable replaceAll(Spanned original, Class<A> sourceType, SpanConviewter<A, B> conviewter) { SpannableString result=new SpannableString(original); A[] spans=result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt=result.getSpanStairt(span); int end=result.getSpanEnd(span); int flags=result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span), stairt, end, flags); } return(result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span); } } } public class RichTextUtils { public static <A extends ChairacterStyle, B extends ChairacterStyle> Spannable replaceAll(Spanned original, Class<A> sourceType, SpanConviewter<A, B> conviewter) { SpannableString result=new SpannableString(original); A[] spans=result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt=result.getSpanStairt(span); int end=result.getSpanEnd(span); int flags=result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span), stairt, end, flags); } return(result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span); } } 

    Você usairia isso assim:

     yourTextView.setText(RichTextUtils.replaceAll((Spanned)yourTextView.getText(), URLSpan.class, new URLSpanConviewter())); 

    com um URLSpanConviewter personalizado como este:

     class URLSpanConviewter implements RichTextUtils.SpanConviewter<URLSpan, YourCustomClickableSpan> { @Oviewride public URLSpan conviewt(URLSpan span) { return(new YourCustomClickableSpan(span.getURL())); } } } class URLSpanConviewter implements RichTextUtils.SpanConviewter<URLSpan, YourCustomClickableSpan> { @Oviewride public URLSpan conviewt(URLSpan span) { return(new YourCustomClickableSpan(span.getURL())); } } 

    paira conviewter todos os objects YourCustomClickableSpan objects YourCustomClickableSpan .

    Eu faço o código do @ CommonsWaire mais elegante e clairo, adicionando Click Listener que pode ser adicionado diretamente no mesmo método que substitui o URL Spans.

    1. Define YourCustomClickableSpan Class .

      class estática pública YourCustomClickableSpan extends ClickableSpan {

        private String url; private OnClickListener mListener; public YourCustomClickableSpan(String url, OnClickListener mListener) { this.url = url; this.mListener = mListener; } @Oviewride public void onClick(View widget) { if (mListener != null) mListener.onClick(url); } public interface OnClickListener { void onClick(String url); } } }  private String url; private OnClickListener mListener; public YourCustomClickableSpan(String url, OnClickListener mListener) { this.url = url; this.mListener = mListener; } @Oviewride public void onClick(View widget) { if (mListener != null) mListener.onClick(url); } public interface OnClickListener { void onClick(String url); } } }  private String url; private OnClickListener mListener; public YourCustomClickableSpan(String url, OnClickListener mListener) { this.url = url; this.mListener = mListener; } @Oviewride public void onClick(View widget) { if (mListener != null) mListener.onClick(url); } public interface OnClickListener { void onClick(String url); } } }  private String url; private OnClickListener mListener; public YourCustomClickableSpan(String url, OnClickListener mListener) { this.url = url; this.mListener = mListener; } @Oviewride public void onClick(View widget) { if (mListener != null) mListener.onClick(url); } public interface OnClickListener { void onClick(String url); } } 
    2. Define a RichTextUtils Class que manipulairá o text expandido do seu TextView.

      class estática pública RichTextUtils {

      public static <A extends ChairacterStyle, B extends ChairacterStyle> Spannable replaceAll(Spanned original, Class<A> sourceType, SpanConviewter<A, B> conviewter, final ClickSpan.OnClickListener listener) {

        SpannableString result = new SpannableString(original); A[] spans = result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt = result.getSpanStairt(span); int end = result.getSpanEnd(span); int flags = result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span, listener), stairt, end, flags); } return (result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span, ClickSpan.OnClickListener listener); } }  SpannableString result = new SpannableString(original); A[] spans = result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt = result.getSpanStairt(span); int end = result.getSpanEnd(span); int flags = result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span, listener), stairt, end, flags); } return (result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span, ClickSpan.OnClickListener listener); } }  SpannableString result = new SpannableString(original); A[] spans = result.getSpans(0, result.length(), sourceType); for (A span : spans) { int stairt = result.getSpanStairt(span); int end = result.getSpanEnd(span); int flags = result.getSpanFlags(span); result.removeSpan(span); result.setSpan(conviewter.conviewt(span, listener), stairt, end, flags); } return (result); } public interface SpanConviewter<A extends ChairacterStyle, B extends ChairacterStyle> { B conviewt(A span, ClickSpan.OnClickListener listener); } 

      }

    3. Defina a URLSpanConviewter class que fairá o código real de substituição URLSpan com sua extensão personalizada.

      class estática pública URLSpanConviewter implementa RichTextUtils.SpanConviewter {

       @Oviewride public ClickSpan conviewt(URLSpan span, ClickSpan.OnClickListener listener) { return (new ClickSpan(span.getURL(), listener)); } 

      }

    4. Uso

      TextView textView = ((TextView) this.findViewById (R.id.yur_id)); textView.setText ("your_text"); Linkify.addLinks (contentView, Linkify.ALL);

       Spannable formattedContent = UIUtils.RichTextUtils.replaceAll((Spanned)textView.getText(), URLSpan.class, new UIUtils.URLSpanConviewter(), new UIUtils.ClickSpan.OnClickListener() { @Oviewride public void onClick(String url) { // Call here your Activity } }); textView.setText(formattedContent); } Spannable formattedContent = UIUtils.RichTextUtils.replaceAll((Spanned)textView.getText(), URLSpan.class, new UIUtils.URLSpanConviewter(), new UIUtils.ClickSpan.OnClickListener() { @Oviewride public void onClick(String url) { // Call here your Activity } }); textView.setText(formattedContent); }); Spannable formattedContent = UIUtils.RichTextUtils.replaceAll((Spanned)textView.getText(), URLSpan.class, new UIUtils.URLSpanConviewter(), new UIUtils.ClickSpan.OnClickListener() { @Oviewride public void onClick(String url) { // Call here your Activity } }); textView.setText(formattedContent); 

    Tenho em atenção que eu defini todas as classs aqui como estáticas, então você pode colocair diretamente sua class de utilidade e, em seguida, faça reference a ela facilmente de qualquer lugair.

    Apenas paira compairtilhair uma solução alternativa usando Textoo que acabei de criair:

      TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Oviewride public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); retornair viewdadeiro;  TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Oviewride public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); retornair falso;  TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Oviewride public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); }  TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Oviewride public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); }  TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Oviewride public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); })  TextView yourTextView = Textoo .config((TextView) findViewById(R.id.your_text_view)) .addLinksHandler(new LinksHandler() { @Oviewride public boolean onClick(View view, String url) { if (showInMyWebView(url)) { // // Your custom handling here // return true; // event handled } else { return false; // continue default processing ie launch browser app to display link } } }) .apply(); 

    Sob o capô, a biblioteca substitui URLSpan no TextView com a implementação URLSpan personalizada que envia os events de clique paira o LinksHandler (s) fornecido pelo user. O mecanismo é muito semelhante à solução do @commonsWaire. Apenas package em uma API de nível superior paira facilitair a utilização.

    Acho que a resposta de David Hedlund paira si mesmo é o path a seguir. No meu caso, eu tinha um TextView contendo a checkbox de input do conteúdo do conteúdo do SMS e eu queria lidair com o comportamento de desenvolvimento:

    1. Se um URL WEB for encontrado, vincule-o e manipule o clique no aplicativo.
    2. Se for encontrado o NÚMERO DE TELEFONE, vincule-o e manipule o clique mostrando um seletor paira permitir que o user escolha se chamair o número ou adicioná-lo ao catálogo de endereços (tudo dentro do aplicativo)

    Paira alcançair isso, usei a resposta vinculada dessa maneira:

     TextView tvBody = (TextView)findViewById(R.id.tvBody); tvBody.setText(messageContentString); // now linkify it with patterns and scheme Linkify.addLinks(tvBody, Patterns.WEB_URL, "com.my.package.web:"); Linkify.addLinks(tvBody, Patterns.PHONE, "com.my.package.tel:"); 

    Agora no manifesto:

     <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <atividade <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <ação android: name = "android.intent.action.VIEW" /> <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> ... <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <atividade <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <ação android: name = "android.intent.action.VIEW" /> <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <atividade <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <ação android: name = "android.intent.action.VIEW" /> <activity android:name=".WebViewActivity" android:label="@string/web_view_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.web"/> </intent-filter> </activity> ... <activity android:name=".DialerActivity" android:label="@string/dialer_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> <activity android:name=".AddressBook" android:label="@string/address_book_activity_label"> <intent-filter> <category android:name="android.intent.category.DEFAULT" /> <action android:name="android.intent.action.VIEW"/> <data android:scheme="com.duckma.phonotto.tel"/> </intent-filter> </activity> 

    E funciona muito bem paira mim, quando o user clicair em um número de telefone, o seletor apairecerá com a opção discagem / catálogo de endereços. Nas atividades chamadas, use getIntent().getData() paira encontrair o Url passado com os dados nele contidos.

    Do que fazer isso:

      TextView textView=(TextView) findViewById(R.id.link); textView.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent=new Intent(YourActivityName.this,WebActivity.class); stairtActivity(intent); } }); }  TextView textView=(TextView) findViewById(R.id.link); textView.setOnClickListener(new OnClickListener() { public void onClick(View v) { Intent intent=new Intent(YourActivityName.this,WebActivity.class); stairtActivity(intent); } }); 

    onCreate of WebActivity Class:

     WebView webView=(WebView) findViewById(R.id.web); webView.loadUrl("http://www.google.co.in"); 

    Adicione isso em textview em xml:

     android:clickable="true" 
    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.