2011-08-31 13 views

Respuesta

26
Spanned spanned = Html.fromHtml("<a href=\"http://google.com\">google.com</a>"); 
textView.setText(spanned); 

EDITAR: Eso no es una forma ideal para manejar clic en un enlace, pero no sé de ninguna otra manera.

Su actividad principal contiene un TextView con un enlace. El enlace URL tiene un esquema personalizado.

public class MainActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     TextView link = (TextView)findViewById(R.id.link); 
     link.setText(
      Html.fromHtml("<a href='myscheme://www.google.com'>link</a>")); 
     link.setMovementMethod(LinkMovementMethod.getInstance()); 
    } 
} 

Cuando se hace clic en este enlace Android pone en marcha un Activity con ACTION_VIEW utilizando la URL del enlace. Supongamos que tiene un WebViewActivity que maneja los URI con este esquema personalizado. Obtiene el URI pasado y reemplaza su esquema con http.

public class WebViewActivity extends Activity { 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     if(savedInstanceState == null) { 
      String url = 
       getIntent().getDataString().replace("myscheme://", "http://"); 
      // do something with this URL. 
     } 
    } 
} 

Para manejar personalizados esquemas URI WebViewActivity debe tener un filtro de intención en el archivo AndroidManifest.xml:

<activity android:name=".WebViewActivity" android:exported="false"> 
    <intent-filter> 
     <action android:name="android.intent.action.VIEW" /> 
     <category android:name="android.intent.category.DEFAULT" /> 
     <data android:scheme="myscheme" /> 
    </intent-filter> 
</activity> 
+0

Gracias Pixie, pero se abrirá en el navegador predeterminado no en WebView. :( –

+1

Oh, he entendido mal su pregunta. En este caso, puede crear una URL con su propio esquema y registrarla con un filtro de intención en AndroidManifest.xml. – Michael

+0

Gracias de nuevo, pero puede explicarlo un poco más. –

-2
hotel_website=(TextView)viewflipper.findViewById(R.id.tv_website); 
hotel_website.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
    String url = "http://" +hotel_website.getText().toString(); 
    Intent i = new Intent(Intent.ACTION_VIEW); 
    i.setData(Uri.parse(url)); 
    startActivity(i); 
    } 
}); 

y en XML

<TextView 
    android:clickable="true" 
</TextView> 
2

establezca la propiedad androide: autolink a su diseño de vista de texto

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content"   
    android:text="your text" 
    android:autoLink="web" /> 
+0

Esto abre enlaces en el navegador. La respuesta es cómo abrir enlaces en WebView – eugeneek

+0

Solo un pequeño problema. Después de aplicar autoLink, el color cambió a Verde y aplicar color diferente no funciona. Como es que ? – Mahadev

+0

Usted me salvó el día. Gracias :) – Atul

0

Siguiendo funcionó para mí. Acabo de utilizar el código onTouchEvent de LinkMovementMethod. Estableces el enlace en textView como Michael mencionó anteriormente o puedes establecerlo en strings.xml. Uso esta biblioteca para abrir los enlaces https://github.com/DreaminginCodeZH/CustomTabsHelper.

textView.setMovementMethod(new MovementMethod() { 
     @Override 
     public void initialize(TextView widget, Spannable text) { 

     } 

     @Override 
     public boolean onKeyDown(TextView widget, Spannable text, int keyCode, KeyEvent event) { 
      return false; 
     } 

     @Override 
     public boolean onKeyUp(TextView widget, Spannable text, int keyCode, KeyEvent event) { 
      return false; 
     } 

     @Override 
     public boolean onKeyOther(TextView view, Spannable text, KeyEvent event) { 
      return false; 
     } 

     @Override 
     public void onTakeFocus(TextView widget, Spannable text, int direction) { 

     } 

     @Override 
     public boolean onTrackballEvent(TextView widget, Spannable text, MotionEvent event) { 
      return false; 
     } 

     /** 
     * Borrowed code for detecting and selecting link from 
     * {@link LinkMovementMethod#onTouchEvent(TextView, Spannable, MotionEvent)} 
     */ 
     @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); 

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

       if (link.length != 0) { 
        if (action == MotionEvent.ACTION_UP) { 
         // do whatever else you want here on link being clicked 
         Selection.removeSelection(buffer); 

        } else if (action == MotionEvent.ACTION_DOWN) { 
         Selection.setSelection(buffer, 
           buffer.getSpanStart(link[0]), 
           buffer.getSpanEnd(link[0])); 
        } 

        return true; 
       } else { 
        Selection.removeSelection(buffer); 
       } 
      } 

      return false; 
     } 

     @Override 
     public boolean onGenericMotionEvent(TextView widget, Spannable text, MotionEvent event) { 
      return false; 
     } 

     @Override 
     public boolean canSelectArbitrarily() { 
      return false; 
     } 
    }); 
Cuestiones relacionadas