Skip to content

Instantly share code, notes, and snippets.

@whitfin
Created January 28, 2014 21:09
Show Gist options
  • Star 9 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save whitfin/8676560 to your computer and use it in GitHub Desktop.
Save whitfin/8676560 to your computer and use it in GitHub Desktop.
Custom Link Movement to open any clicked links inside an inline browser. Requires either a custom inline browser, or the one I created in a gist.
package com.zackehh.example;
import com.zackehh.example.MinimalBrowser;
import android.content.Context;
import android.content.Intent;
import android.text.Layout;
import android.text.Spannable;
import android.text.method.MovementMethod;
import android.text.style.URLSpan;
import android.view.MotionEvent;
import android.widget.TextView;
/**
* Implementation of LinkMovementMethod to allow the loading of
* a link clicked inside text inside an Android application
* without exiting to an external browser.
*
* @author Isaac Whitfield
* @version 25/08/2013
*/
public class LinkMovementMethod extends android.text.method.LinkMovementMethod {
// The context we pass to the method
private static Context movementContext;
// A new LinkMovementMethod
private static LinkMovementMethod linkMovementMethod = new LinkMovementMethod();
public static MovementMethod getInstance(Context c){
// Set the context
movementContext = c;
// Return this movement method
return linkMovementMethod;
}
public boolean onTouchEvent(TextView widget, Spannable buffer, MotionEvent event){
// Get the event action
int action = event.getAction();
// If action has finished
if(action == MotionEvent.ACTION_UP) {
// Locate the area that was pressed
int x = (int) event.getX();
int y = (int) event.getY();
x -= widget.getTotalPaddingLeft();
y -= widget.getTotalPaddingTop();
x += widget.getScrollX();
y += widget.getScrollY();
// Locate the URL text
Layout layout = widget.getLayout();
int line = layout.getLineForVertical(y);
int off = layout.getOffsetForHorizontal(line, x);
// Find the URL that was pressed
URLSpan[] link = buffer.getSpans(off, off, URLSpan.class);
// If we've found a URL
if (link.length != 0) {
// Find the URL
String url = link[0].getURL();
// If it's a valid URL
if (url.contains("https") | url.contains("tel") | url.contains("mailto") | url.contains("http") | url.contains("https") | url.contains("www")){
// Open it in an instance of InlineBrowser
movementContext.startActivity(new Intent(movementContext, MinimalBrowser.class).putExtra("url", url));
}
// If we're here, something's wrong
return true;
}
}
return super.onTouchEvent(widget, buffer, event);
}
}
Copy link

ghost commented May 13, 2016

Please, how do I use this?

@mewa
Copy link

mewa commented Jun 27, 2016

Instead of finding vertical and horizontal offset separately, you could just use
int offset = widget.getOffsetForPosition(event.getX(), event.getY());

@lectricas
Copy link

saved my life.

@axxapy
Copy link

axxapy commented Dec 18, 2018

THANK YOU FOR THAT GIST

@giuseppenovielli
Copy link

very beautiful, thanks!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment