Using ClickableSpan and WebView
public class LangRusReaderActivity extends Activity {
/** Called when the activity is first created. */
private TextView tv;
private static WebView wv;
private String str = "Головной ракетный крейсер четвертого поколения \"Юрий Долгорукий\" " +
"поднимет Андреевский стяг как боевая единица российского ВМФ уже в июле. И день флота " +
"его экипаж встретит в месте постоянного базирования. Будет это Вилючинск на Камчатке или " +
"Западная Лица на Кольском полуострове, пока не уточняется. Но в Минобороны, в Объединенной " +
"судостроительной корпорации и на \"Севмаше\" уже не скрывают: первенец в серии подводных " +
"ракетоносцев, созданных по проекту 955 \"Борей\" санкт-петербургского ЦКБ \"Рубин\", завершает" +
" финальный этап испытаний в Белом море.";
private String [] strings; //To every word in the str into an string array
private String result=""; //To de-array "strings[]" into a string
private CharSequence text; //For spannable use
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initiation();
toHtmlFormat();
toSpannableString ();
}
private void initiation () {
tv = (TextView) findViewById(R.id.textview01);
tv.setTextSize(20);
tv.setLinkTextColor(Color.BLUE);
tv.setMovementMethod(LinkMovementMethod.getInstance());
wv = (WebView) findViewById(R.id.webView);
wv.setWebViewClient(new WebViewClient()); //Create
WebSettings ws = wv.getSettings(); // Get obj
ws.setJavaScriptEnabled(true);
ws.setSupportZoom(true);
ws.setBuiltInZoomControls(true);
wv.clearCache(true);
wv.canGoBack();
wv.canGoForward();
}
//Rearrange the text into the HTML format
private void toHtmlFormat () {
strings = TextUtils.split(str, " ");
//clear empty space on both sides of a word if any
for (int i=0; i<strings.length; i++) {
String temp = "";
temp = strings[i].trim();
temp = "<a style='color:yellow' href='" + temp + "'> "+ temp + "</a>"; // Turn into HTML format
strings[i] = temp;
}
for (int i=0; i<strings.length; i++) {
result += strings[i];
}
tv.setText(Html.fromHtml(result));
}// end of toHTMLFormat
//Make every word from result into clickable spannableString
private void toSpannableString () {
text = tv.getText();
if (text instanceof Spannable) {
Spannable sp = (Spannable) tv.getText();
//Toast.makeText(this, sp, Toast.LENGTH_LONG).show();
URLSpan[] urlspan = sp.getSpans(0, text.length(), URLSpan.class);
SpannableStringBuilder style = new SpannableStringBuilder(text);
style.clearSpans();
for (URLSpan url : urlspan) {
MyClickableURLSpan mClickUrlSpan = new MyClickableURLSpan(url.getURL());
style.setSpan(mClickUrlSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
tv.setText(style);
}
}
private static class MyClickableURLSpan extends ClickableSpan {
private String mUrl;
public MyClickableURLSpan(String url) {
// TODO Auto-generated constructor stub
mUrl = url;
}
@Override
public void onClick(View widget) {
// TODO Auto-generated method stub
//Remove any punctuation sign of a word on right hand side, e.g. "," , "!", or "."
String temp = "";
if (mUrl.startsWith("(") || mUrl.startsWith("[")) {
temp = mUrl.substring(1, mUrl.length());
mUrl = temp;
}
if (mUrl.endsWith(")") || mUrl.endsWith("]") ) {
temp = mUrl.substring(0, mUrl.length()-1);
mUrl = temp;
}
if (mUrl.startsWith("\"") || mUrl.startsWith("'")) {
temp = mUrl.substring(1, mUrl.length());
mUrl = temp;
}
if (mUrl.endsWith("\"") || mUrl.endsWith("'")) {
temp = mUrl.substring(0, mUrl.length()-1);
mUrl = temp;
}
if (mUrl.endsWith(".") || mUrl.endsWith(",") || mUrl.endsWith("!")) {
temp = mUrl.substring(0, mUrl.length()-1);
mUrl = temp;
}
wv.loadUrl("http://lingvo.yandex.ru/" + mUrl + "/по-английски/");
}
@Override
public void updateDrawState(TextPaint ds) {
// TODO Auto-generated method stub
//super.updateDrawState(ds);
ds.setColor(ds.linkColor);
ds.setUnderlineText(false);
}
}//end of class
}
*************************
res/layout/main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="#00FF00"
android:textSize="16dp"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="2dp"
android:text="英文新聞"></TextView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="horizontal" >
<!--
android:layout_marginTop="10dp"
-->
<WebView
android:id="@+id/webView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_weight="1"
/>
<ScrollView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="#FFF380"
android:fadingEdge="vertical"
android:paddingTop="10dip"
android:scrollbars="vertical" >
<TextView
android:id="@+id/textview01"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:paddingLeft="4dp"
android:text="@string/hello" >
</TextView>
</ScrollView>
</LinearLayout>
***********************
Manifest.xml:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.cq.spannable.read.english.text"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk android:minSdkVersion="10" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:icon="@drawable/read"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".Cq_SpannableReadEngActivity"
android:screenOrientation="landscape" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>