㈠ 如何實現一個 android 端的富文本編輯器
在 Android 上實現富文本編輯器的思路大致分為三種:
使用多種 Layout 布局,每一種布局對應一種 HTML 格式,比如圖片,比如順序列表等。具體的實現例子可以參考這個鏈接。 Medium 和
Evernote 的富文本編輯就是採用這種方式實現的。總體來說比較復雜。
WebView + JavaScript 實現。現在 Web 端有很多成熟的 JavaScript 富文本編輯庫,比如 Squire ,你只需要做好
WebView 和 JavaScript 的交互就可以了(多寫回調函數)。理論上雖然是這么說,但是在實現過程你需要解決 WebView 的兼容性問題(
Android 4.4 及其以上版本和 4.4 以下版本的 WebView 內核不一樣),以及其他一些不可預見的問題(比如就遇到無法粘貼文字的問題)。
EditText + Span 。 Android 的 TextView 原生支持諸如粗體、刪除線、引用等 Span
,要實現簡單的富文本編輯需求,可操作性還是比較大的。綜合再三,選擇了這種方式來實現自己的需求。
既然決定使用 EditText + Span 的方式來實現,必然要對相關的 API 有所了解。
首先來了解一下 Span 。Span 是一個強大的概念,有興趣深入的同學推薦直接閱讀這篇譯文。
在這里主要使用兩種類型的 Span :
繼承自 CharacterStyle 的 Span ,比如 StyleSpan ,可以在字元級別上添加粗體,下劃線等。
繼承自 ParagraphStyle 的 Span ,比如 QuoteSpan ,可以為段落級別的文本添加引用。
接著需要一個可以將 Span 的效果設置進去的文本結構(即實現了 Spannable 介面), SpannableStringBuilder
是個不錯的選擇,同時 EditText 提供的 getEditableText() 方法也可以獲得。通常只需要 getEditableText()
就可以了,但是在面對一些細節部分,可以使用 SpannableStringBuilder 預先設置相應的 Span ,再替換到原來的文本中。
設置 Span 的方式也很簡單,需要調用 Spannable.setSpan(Object what, int start, int end, int
flags) 這個方法即可,方法中 4 個參數的解釋如下:
Object what ,傳入你使用的 Span 對象。
int start ,設置 Span 的開始位置。
int end ,設置 Span 的結束位置。
int flags ,代表設置 Span 的作用域。
在這里重點介紹一下 int flags 這個參數,它接受 4 種類型的參數,分別是:
Spanned.SPAN_INCLUSIVE_EXCLUSIVE ,表示你在設置 Span 的區域之前輸入文字,輸入的文字也會受到 Span
的影響。
Spanned.SPAN_INCLUSIVE_INCLUSIVE ,表示你在設置 Span 的區域前後輸入文字,輸入的文字都後受到 Span
的影響。
Spanned.SPAN_EXCLUSIVE_EXCLUSIVE ,表示你在設置 Span 的區域中出輸入文字,輸入的文字才會受到 Span
的影響。
Spanned.SPAN_EXCLUSIVE_INCLUSIVE ,表示你在設置 Span 的區域之後輸入文字,輸入的文字也會受到 Span
的影響。
「受到影響」的意思就是,仍然會保持你設置的 Span 的樣式,比如選擇Spanned.SPAN_EXCLUSIVE_INCLUSIVE
設置了一段文字的粗體,那麼在這段文字後新輸入的文字,也會是粗體。在這里推薦使用Spanned.SPAN_EXCLUSIVE_EXCLUSIVE
參數,畢竟其他幾種參數相對不是很好控制,而且會給使用的人帶來的疑惑。認為一個操作代表的行為應當是准確沒有歧義的。
好,到這里已經知道大致怎麼作出一個富文本編輯器組件的樣子了,無非是指定開始位置和結束位置,再設置相應的 Span
即可。至於設置的時候採取什麼樣的規則,你可以自己定製。但僅僅解決了編輯的問題,仍然存在導入的問題和導出的問題。
導入的問題十分簡單, Android SDK 中提供了 Html.fromHtml() 這個方法,可以很輕松地將 HTML 字元串轉換為所需的
Spanned 對象。但是需要注意的是, Html.fromHtml() 並不支持所有的 HTML 標簽,比如無序列表就不支持,因此你需要自己實現
Html.TagHandler 介面來處理自己所需的標簽,可以參考這個鏈接,實現了刪除線和簡單無序列表的支持。
面對粗體、斜體這樣字元級別的樣式, Html.fromHtml()
會自然而然的解析,該添加換行的地方就添加換行,並沒有什麼問題;但是面對引用、無序列表這樣段落級別的樣式,該方法會追加一個換行,也就是兩個換行操作,相當於多出一個空行。通常來說認為一個
對應兩個
,但是如果你有特別需求的話,也可以通過前面說的那樣,自己來解析,而不是用系統默認的方式。
之前介紹了如何導入,想必你也十分清楚,必然有一個對應的Html.toHtml() 方法!沒錯,但是遺憾的是,這個方法也不全支持所有 Span
,比如列表就不支持。不過沒有關系, Html.toHtml() 這個方法本身的源碼簡潔易懂,可以參考著實現。
在這里重點說明 Spannanle 的一個介面方法 nextSpanTransition(int start, int limit, Class
type) ,這個方法會在你指定的文本范圍內,返回下一個你指定的 Span 類型的開始位置,依照這個方法,就可以逐層掃描指定的 Span
,而不用同時考慮其他類型的 Span 的影響,十分有用。
最後盡管說了這么多,導入導出還是有一個比較關鍵的問題,即導入的內容和導出的內容要保持一致,在這點上目前我還比較難以實現,只能說盡量控制吧,必要的時候還需要使用一下正則來處理導入導出的文本。
㈡ 在android中怎樣設置textview的文本
TextView的屬性:
Android:autoLink設置是否當文本為URL鏈接/email/電話號碼/map時,文本顯示為可點擊的鏈接。可選值(none/web /email/phone/map/all)
android:autoText如果設置,將自動執行輸入值的拼寫糾正。此處無效果,在顯示輸入法並輸入的時候起作用。
android:bufferType指定getText()方式取得的文本類別。選項editable 類似於StringBuilder可追加字元,也就是說getText後可調用append方法設置文本內容。spannable 則可在給定的字元區域使用樣式,參見這里1、這里2。
android:capitalize設置英文字母大寫類型。此處無效果,需要彈出輸入法才能看得到,參見EditView此屬性說明。
android:cursorVisible設定游標為顯示/隱藏,默認顯示。
android:digits設置允許輸入哪些字元。如「1234567890.+-*/% ()」
android:drawableBottom在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會把text的背景設為該顏色,並且同時和background使用時覆蓋後者。
android:drawableLeft在text的左邊輸出一個drawable,如圖片。
android:drawablePadding設置text與drawable(圖片)的間隔,與drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可設置為負數,單獨使用沒有效果。
android:drawableRight在text的右邊輸出一個drawable。
android:drawableTop在text的正上方輸出一個drawable。
android:editable設置是否可編輯。
android:editorExtras設置文本的額外的輸入數據。
android:ellipsize設置當文字過長時,該控制項該如何顯示。有如下值設置:」start」—?省略號顯示在開頭;」end」 ——省略號顯示在結尾;」middle」—-省略號顯示在中間;」marquee」 ——以跑馬燈的方式顯示(動畫橫向移動)
android:freezesText設置保存文本的內容以及游標的位置。
android:gravity設置文本位置,如設置成「center」,文本將居中顯示。
android:hintText為空時顯示的文字提示信息,可通過textColorHint設置提示信息的顏色。此屬性在 EditView中使用,但是這里也可以用。
android:imeOptions附加功能,設置右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個「完成」,而不設置默認是一個回車符號。這個在EditView中再詳細說明,此處無用。
android:imeActionId設置IME動作ID。
android:imeActionLabel設置IME動作標簽。
android:includeFontPadding設置文本是否包含頂部和底部額外空白,默認為true。
android:inputMethod為文本指定輸入法,需要完全限定名(完整的包名)。例如:com.google.android.inputmethod.pinyin,但是這里報錯找不到。
android:inputType設置文本的類型,用於幫助輸入法顯示合適的鍵盤類型。在EditView中再詳細說明,這里無效果。
android:linksClickable設置鏈接是否點擊連接,即使設置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為 marquee_forever時表示無限次。
android:ems設置TextView的寬度為N個字元的寬度。這里測試為一個漢字字元寬度
android:maxEms設置TextView的寬度為最長為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:minEms設置TextView的寬度為最短為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:maxLength限制顯示的文本長度,超出部分不顯示。
android:lines設置文本的行數,設置兩行就顯示兩行,即使第二行沒有數據。
android:maxLines設置文本的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
android:minLines設置文本的最小行數,與lines類似。
android:lineSpacingExtra設置行間距。
android:lineSpacingMultiplier設置行間距的倍數。如」1.2」
android:numeric如果被設置,該TextView有一個數字輸入法。此處無用,設置後唯一效果是TextView有點擊效果,此屬性在EdtiView將詳細說明。
android:password以小點」.」顯示文本
android:phoneNumber設置為電話號碼的輸入方式。
android:privateImeOptions設置輸入法選項,此處無用,在EditText將進一步討論。
android:scrollHorizontally設置文本超出TextView的寬度的情況下,是否出現橫拉條。
android:selectAllOnFocus如果文本是可選擇的,讓他獲取焦點而不是將游標移動為文本的開始位置或者末尾位置。 TextView中設置後無效果。
android:shadowColor指定文本陰影的顏色,需要與shadowRadius一起使用。
android:shadowDx設置陰影橫向坐標開始位置。
android:shadowDy設置陰影縱向坐標開始位置。
android:shadowRadius設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好。
android:singleLine設置單行顯示。如果和layout_width一起使用,當文本不能全部顯示時,後面用「…」來表示。如android:text="test_ singleLine "
android:singleLine="true" android:layout_width="20dp"將只顯示「t…」。如果不設置singleLine或者設置為false,文本將自動換行
android:text設置顯示文本.
android:textAppearance設置文字外觀。如 「?android:attr/textAppearanceLargeInverse」這里引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用默認的外觀。可設置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textColor設置文本顏色
android:textColorHighlight被選中文字的底色,默認為藍色
android:textColorHint設置提示信息文字的顏色,默認為灰色。與hint一起使用。
android:textColorLink文字鏈接的顏色.
android:textScaleX設置文字之間間隔,默認為1.0f。
android:textSize設置文字大小,推薦度量單位」sp」,如」15sp」
android:textStyle設置字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設置一個或多個,用「|」隔開
android:typeface設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2, monospace(等寬字體) 3]
android:height設置文本區域的高度,支持度量單位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight設置文本區域的最大高度
android:minHeight設置文本區域的最小高度
android:width設置文本區域的寬度,支持度量單位:px(像素)/dp/sp/in/mm(毫米),與layout_width 的區別看這里。
android:maxWidth設置文本區域的最大寬度
android:minWidth設置文本區域的最小寬度
㈢ android中textview顯示文字比如: 標題:XXXX 後面的XXXX怎麼獲取
TextView是最常用的組件之一用於顯示文本
像這種需求通常是兩個TextView組成的解決方案
用兩個TextView 一個作為標題,一個作為動態內容
還是用一個TexeView 直接getText().toString() 得到文本再調用String的api split(":") 拆分,即通過:進行拆分
通常在android中都是用兩個TextVew來處理的,前面一個TextVew作為標題,是固定不變的,後面一個TextVew作為變數,動態顯示內容
獲取textView文本的api :
String txt = textView.getText().toString();
㈣ android textview什麼意思
android系統的文本視圖的意思。
TextView是android裡面用的最多的控制項,TextView類似一般UI中的Label,TextBlock等控制項,只是為了單純的顯示一行或多行文本。TextView作為android開發中最簡單也最常用的控制項,作為初學者,需要熟知其屬性並熟練掌衡罩握。
android:cursorVisible設定游標為顯示/隱藏,默認顯示。
android:digits設置允許輸入哪些字元。如「1234567890.+-*/% ()」
android:drawableBottom在text的下方輸出一個drawable,如圖片。如果指定一個顏色的話會text的背景設為該顏色,並且同時和background使用時覆蓋後者。
android:drawableLeft在text的左邊輸出一個drawable,如圖片。
android:drawablePadding設置text與drawable(圖片)的間隔,與drawableLeft、 drawableRight、drawableTop、drawableBottom一起使用,可設置為負數,單獨使用沒有效果。
android:drawableRight在text的右邊輸出一個drawable。
android:drawableTop在text的正上方輸出一個drawable。
android:editable設置是否可編輯。
android:editorExtras設置文本的額外的輸入數據。
android:ellipsize設置當文字過長時,該控制項該如何顯示。有如下值設置:」start」—-省略號顯示在開頭;」end」 ——省略號顯示在結尾;」middle」—-省略號顯示在中間;」marquee」 ——以跑馬燈的方式顯示(動畫咐逗鬧橫向移動)
android:freezesText設置保存文本的內容以及游標的位置。
android:gravity設置文本位置,如設置成「center」,文本將居中顯示。
android:hintText為空時顯示的文字提示信息,可通過textColorHint設置提示信息的顏色。此屬性在 EditView中使用,但是這里也可以用。
android:imeOptions附加功能,設置右下角IME動作與編輯框相關的動作,如actionDone右下角將顯示一個「完成」,而不設置默認是一個回車符號。這個在EditView中再詳細說明,此處無用。
android:imeActionId設置IME動作ID。
android:imeActionLabel設置IME動作標簽。
android:includeFontPadding設置文本是否包含頂部和底部額外空白,默認為true。
android:inputMethod為文本指定輸入法,需要完全限定名(完整的包名)。
android:inputType設置文本的類型,用於幫助輸入法顯示合適的鍵盤類型。在EditView中再詳細說明,這里無效果。
android:linksClickable設置鏈接是否點擊連接,即使設置了autoLink。
android:marqueeRepeatLimit在ellipsize指定marquee的情況下,設置重復滾動的次數,當設置為 marquee_forever時表示無限次。
android:ems設指斗置TextView的寬度為N個字元的寬度。這里測試為一個漢字字元寬度
android:maxEms設置TextView的寬度為最長為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:minEms設置TextView的寬度為最短為N個字元的寬度。與ems同時使用時覆蓋ems選項。
android:maxLength限制顯示的文本長度,超出部分不顯示。
android:lines設置文本的行數,設置兩行就顯示兩行,即使第二行沒有數據。
android:maxLines設置文本的最大顯示行數,與width或者layout_width結合使用,超出部分自動換行,超出行數將不顯示。
android:minLines設置文本的最小行數,與lines類似。
android:lineSpacingExtra設置行間距。
android:lineSpacingMultiplier設置行間距的倍數。如」1.2」
android:numeric如果被設置,該TextView有一個數字輸入法。此處無用,設置後唯一效果是TextView有點擊效果,此屬性在EdtiView將詳細說明。
android:password以小點」.」顯示文本
android:phoneNumber設置為電話號碼的輸入方式。
android:privateImeOptions設置輸入法選項,此處無用,在EditText將進一步討論。
android:scrollHorizontally設置文本超出TextView的寬度的情況下,是否出現橫拉條。
android:selectAllOnFocus如果文本是可選擇的,讓他獲取焦點而不是將游標移動為文本的開始位置或者末尾位置。 TextView中設置後無效果。
android:shadowColor指定文本陰影的顏色,需要與shadowRadius一起使用。
android:shadowDx設置陰影橫向坐標開始位置。
android:shadowDy設置陰影縱向坐標開始位置。
android:shadowRadius設置陰影的半徑。設置為0.1就變成字體的顏色了,一般設置為3.0的效果比較好。
android:singleLine設置單行顯示。如果和layout_width一起使用,當文本不能全部顯示時,後面用「…」來表示。
android:singleLine="true" android:layout_width="20dp"將只顯示「t…」。如果不設置singleLine或者設置為false,文本將自動換行
android:text設置顯示文本.
android:textAppearance設置文字外觀。如 「?android:attr/textAppearanceLargeInverse」這里引用的是系統自帶的一個外觀,?表示系統是否有這種外觀,否則使用默認的外觀。可設置的值如下:textAppearanceButton/textAppearanceInverse/textAppearanceLarge/textAppearanceLargeInverse/textAppearanceMedium/textAppearanceMediumInverse/textAppearanceSmall/textAppearanceSmallInverse
android:textColor設置文本顏色
android:textColorHighlight被選中文字的底色,默認為藍色
android:textColorHint設置提示信息文字的顏色,默認為灰色。與hint一起使用。
android:textColorLink文字鏈接的顏色.
android:textScaleX設置文字之間間隔,默認為1.0f。
android:textSize設置文字大小,推薦度量單位」sp」,如」15sp」
android:textStyle設置字形[bold(粗體) 0, italic(斜體) 1, bolditalic(又粗又斜) 2] 可以設置一個或多個,用「|」隔開
android:typeface設置文本字體,必須是以下常量值之一:normal 0, sans 1, serif 2,
monospace(等寬字體) 3]
android:height設置文本區域的高度,支持度量單位:px(像素)/dp/sp/in/mm(毫米)
android:maxHeight設置文本區域的最大高度
android:minHeight設置文本區域的最小高度
android:width設置文本區域的寬度,支持度量單位:px(像素)/dp/sp/in/mm(毫米),與layout_width 的區別看這里
android:maxWidth設置文本區域的最大寬度
android:minWidth設置文本區域的最小寬度