顯示具有 android -- string 標籤的文章。 顯示所有文章
顯示具有 android -- string 標籤的文章。 顯示所有文章

2012年8月18日 星期六

俄文新聞 + ClickableSpan and WebView

閱讀有註解的俄文新聞
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>


Spannable String 的變化


Spannable String 的變化

public class Cq_SpannableStringActivity extends Activity {
    /** Called when the activity is first created. */
TextView mtv = null;
SpannableString msp = null;
String source = "字體測試字體大小一半兩倍前景色背景色正常粗體斜體粗斜體下畫線刪除線x1x2電話郵件網站斷信採信地圖X軸綜合/bot";
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        
        mtv = (TextView) findViewById(R.id.textview);
        
        //Create a SpannableString obj
        msp = new SpannableString(source);
        
        //Set font (default, default-bold, monospace, serif, san-serif)
        msp.setSpan(new TypefaceSpan("monospace"), 0, 2, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new TypefaceSpan("serif"), 2, 4, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //Set font Size (絕對值,單位:像素)
        msp.setSpan(new AbsoluteSizeSpan(20), 4, 6, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new AbsoluteSizeSpan(20, true), 6, 8, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //dip true: 表示字體大小單位為dip,否則就是像素,同上
        
      //Set font Size (相對值,單位:像素) 參數表示為默認字體大小的倍數
        msp.setSpan(new RelativeSizeSpan(0.5f), 8, 10, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new RelativeSizeSpan(2.5f), 10, 12, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //Set foreground color
        msp.setSpan(new ForegroundColorSpan(Color.MAGENTA), 12, 15, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
      //Set Background color
        msp.setSpan(new BackgroundColorSpan(Color.CYAN), 15, 18, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //Set fontstyle:regular, bold, italic, bold-italic
        msp.setSpan(new StyleSpan(android.graphics.Typeface.NORMAL), 18, 20, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD), 20, 22, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new StyleSpan(android.graphics.Typeface.ITALIC), 22, 24, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new StyleSpan(android.graphics.Typeface.BOLD_ITALIC), 24, 27, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //Set underline, strikethrough, subscript, superscript
        msp.setSpan(new UnderlineSpan(), 27, 30, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan (new StrikethroughSpan(), 30, 33, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan (new SubscriptSpan(), 34, 35, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan (new SuperscriptSpan(), 36, 37, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //Links (setMovementMethod  should be added)
        msp.setSpan(new URLSpan("tel:0229205319"), 37, 39, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new URLSpan("mailto:cqchoucq@gmail.com"), 39, 41, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new URLSpan("http://tw.yahoo.com"), 41, 43, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new URLSpan("sms:0229205319"), 43, 45, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new URLSpan("mms:0229205319"), 45, 47, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        msp.setSpan(new URLSpan("geo:38.899533, -77.036476"), 47, 49, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        //Set fontSize (相對值,單位:像素)參數表示為默認字體寬度的多少倍
        msp.setSpan(new ScaleXSpan(2.0f), 49, 51, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //2.0f 為寬度的兩倍,即x軸方向放大默認字體的兩倍,而高度不變
        
        
        //Set font (including font name, style, color, linking color)
        ColorStateList csllink = null;
        ColorStateList csl = null;
        
        XmlResourceParser xppcolor = getResources().getXml(R.color.color);
        try {
        csl = ColorStateList.createFromXml(getResources(), xppcolor);
        }catch(XmlPullParserException e) {
        e.printStackTrace();
        }catch(IOException e) {
        e.printStackTrace();
        }
        
        XmlResourceParser xpplinkcolor = getResources().getXml(R.color.linkcolor);
        try {
        csllink = ColorStateList.createFromXml(getResources(), xpplinkcolor);
        }catch(XmlPullParserException e) {
        e.printStackTrace();
        }catch(IOException e) {
        e.printStackTrace();
        }
        
        msp.setSpan(new TextAppearanceSpan("monospace", android.graphics.Typeface.BOLD_ITALIC, 30, csl, csllink), 51, 53, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        
        //Set list item symbol
        msp.setSpan (new BulletSpan(android.text.style.BulletSpan.STANDARD_GAP_WIDTH, Color.GREEN), 0, msp.length(), Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        //第一個參數表示symbol的寬度,第二個參數表示symbol的顏色
        
        //setPicture
        Drawable drawable = getResources().getDrawable(R.drawable.ic_launcher);
        drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
        msp.setSpan(new ImageSpan(drawable), 53, 57, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
        
        mtv.setText(msp);
        mtv.setMovementMethod(LinkMovementMethod.getInstance());
        
    }
}

2012年6月17日 星期日

Spannable 文章的每一個字顯示其義


希望按下一段英文文章的每一個字都能顯示其意思。

利用 Spannable 和 ClickableSpan




public class Cq_Spannable01Activity extends Activity {
    /** Called when the activity is first created. */

private TextView tv;
//private ListView lv;
private static Context ctx;

private String str = "I love you, but she doesn't love him.";
private String [] strings;

private String result = ""; //每個元素 加上 href 之後

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
     
   /** Test the displaying of the components in a string **/
       // lv = (ListView) findViewById(R.id.listView1);
        strings = TextUtils.split(str, " ");
        //clear the empty space
        for (int i = 0; i< strings.length; i++) {
        String temp = "";
        String temp02 = "";
        temp = strings[i].trim();
        if (temp.endsWith(".") || temp.endsWith(",")){
        temp02 = temp.substring(0, temp.length()-1);
        temp = temp02;
       
        }
        temp = "<a style='color:yellow' href='" + temp + "'> " + temp + "</a>";
       
        strings[i] = temp;
        }
     
//        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, strings);
//        lv.setAdapter(adapter);
        /** Test the displaying of the components in a string **/
     
     
        for (int i = 0; i<strings.length; i++) {
        result += strings[i];
        }
     
     
     
     
        tv = (TextView) findViewById(R.id.textview);
        tv.setTextSize(25);
        ctx = this;
     
        String htmlLinkText = "";
//        htmlLinkText = "aaaaaaaaaa"
//         + "<a style='color:red' href='我是超連結...'>請按超連結</a>"
//         + "aaaaaaaaaaaaaaaa";
     
     
     
        htmlLinkText = "aaaaaaaaaaa"
        + "<a style='color:yellow' href='我'> I</a>"
        + "<a style='color:red' href='愛'> love</a>"
        + "<a style='color:green' href='妳'> you. </a>"
        + "aaaaaaaaaaaaaaaa";
     
     
     
     
        //tv.setText(Html.fromHtml(htmlLinkText));
        tv.setText(Html.fromHtml(result));
        tv.setMovementMethod(LinkMovementMethod.getInstance());
     
        CharSequence text = tv.getText();
        if (text instanceof Spannable) {
        int end = text.length();
        Spannable sp = (Spannable) tv.getText();
        URLSpan[] urlspan = sp.getSpans(0, end, URLSpan.class);
       
        SpannableStringBuilder style = new SpannableStringBuilder(text);
        style.clearSpans();
        for (URLSpan url : urlspan) {
        MyURLSpan myURLSpan = new MyURLSpan(url.getURL());
        style.setSpan(myURLSpan, sp.getSpanStart(url), sp.getSpanEnd(url), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
        }
       
        tv.setText(style);
        }
     
    }
 
 
    private static class MyURLSpan extends ClickableSpan {
    private String mUrl;
    private String temp;
   
    MyURLSpan(String url) {
    mUrl = url;
   
    }

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub

//widget.setBackgroundColor(Color.parseColor("#00000000"));

if (mUrl.equalsIgnoreCase("I")) {
mUrl = "我";
}else if (mUrl.equalsIgnoreCase("love")) {
mUrl = "愛";

}else if (mUrl.equalsIgnoreCase("you")) {
mUrl = "妳";
}else if (mUrl.equalsIgnoreCase("but")) {
mUrl = "但是";
}else if (mUrl.equalsIgnoreCase("she")) {
mUrl = "她";
}else if (mUrl.equalsIgnoreCase("doesn't")) {
mUrl = "不";
}else if (mUrl.equalsIgnoreCase("him")) {
mUrl = "他";
}

Toast.makeText(ctx, mUrl, Toast.LENGTH_SHORT).show();
}
   
    } //end of class myURLSpan
}

2012年3月11日 星期日

去字串的字元

如果刪除字串的某些字元:



設定某一字串:
String aStr = love;

str = aStr.substring(0, str.length()-0).toString(); // ==> love
str = aStr.substring(0, str.length()-1).toString(); // ==> lov
str = aStr.substring(0, str.length()-2).toString(); // ==> lo
str = aStr.substring(0, str.length()-3).toString(); // ==> l

OR   
str = aStr.substring(0, 1).toString();//l
str = aStr.substring(0, 2).toString();//lo
str = aStr.substring(0, 3).toString();//lov
str = aStr.substring(0, 4).toString();//love



只要取 "crazy" (紅色的部分─12個字元不要):
String aStr = "irrevocably-crazy";

str = aStr.substring(12, aStr.length());   第一個參數是從第幾個字元開始;第二個參數是到哪個字元結束


如果
aStr = "love." 為了要去掉最後的句點  str = aStr.substring (0, aStr.length()-1).toString();

2012年2月21日 星期二

android -- string

Int --> String

/* 如何將一整數(4)轉為字串("4")*/

int anInteger = 4; //設一整數變數

//有三種方式
String integerValueToString = Integer.toString(anInteger);//Ans:4
String valueOfIntegerInString = String.valueOf(anInteger);//Ans:4
String stringValue = new String("" + anInteger);//Ans:4

String string = String.format("I have %d children", 5);