私たちは Android 13 の正式リリースに向けて着実に開発を進めています。Android 13 では、アプリごとの言語設定をはじめとする多言語サポートの改善が重要なテーマです。日本語に関連する機能も 2 つ含まれています。
Android 13 では TextView に新しい機能が追加され、文節を保ったまま改行することができるようになりました。これにより、より洗練された日本語テキスト表示が実現できます。
対象の TextView の lineBreakWordStyle 属性を "phrase" にすることで、文節による改行を設定できます。
lineBreakWordStyle
"phrase"
<TextView android:id="@+id/message_phrase" android:layout_width="match_parent" android:layout_height="wrap_content" android:gravity="center_horizontal" android:lineBreakWordStyle="phrase" android:text="@string/message" />
<TextView
android:id="@+id/message_phrase"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:lineBreakWordStyle="phrase"
android:text="@string/message" />
この動作を確認できるデモが Text サンプルに含まれています。
アプリ側から IME の未確定の変換候補を取得できるようになりました。例えば、「かた」と入力している途中では以下のように 5 つの候補を取得できます。
※ この機能の動作には最新の GBoard が必要です。
テキスト変換候補をアプリから取得する
アプリで検索機能を提供するとき、英語などのアルファベットで表記される言語においては「インクリメンタル サーチ(逐語検索)」または「Search as you type」と呼ばれる動作を提供するのが一般的です。例えば "Shoulder" という検索語句を入力するとき、一文字入力するごとに検索が行われ、単語をすべて入力しなくても目的の検索対象を見つけることができます。
日本語で逐語検索を提供しようとすると工夫が必要になります。IME で「かた」とひらがなを入力している間はアプリ内の漢字の「肩」を含むデータを検索しても一致せず、IME 上で漢字への変換を行って初めて意図した検索ができるからです。これに対応するために例えば連絡帳アプリであれば、あらかじめ読み仮名を登録しておき、ひらがな入力中はそちらから検索することで実現できるでしょう。しかし、漢字のデータしか存在しない場合、逐語検索を実現するのは困難だったのではないでしょうか。
Android 13 のテキスト変換候補 (Text Conversion Suggestions) API を使えば、逐語検索を実現できます。
まず、EditText (またはその小クラスである AppCompatEditText や TextInputEditText) を継承します。このカスタム EditText で onCreateInputConnection をオーバーライドして、カスタムの InputConnection を返します。このカスタム InputConnection の実装については後ほど述べます。
EditText
AppCompatEditText
TextInputEditText
onCreateInputConnection
InputConnection
class MyEditText @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = com.google.android.material.R.attr.editTextStyle) : TextInputEditText(context, attrs, defStyleAttr) { override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection { return MyInputConnection(super.onCreateInputConnection(outAttrs)) }}
class MyEditText @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyleAttr: Int = com.google.android.material.R.attr.editTextStyle
) : TextInputEditText(context, attrs, defStyleAttr) {
override fun onCreateInputConnection(outAttrs: EditorInfo): InputConnection {
return MyInputConnection(super.onCreateInputConnection(outAttrs))
}
レイアウト XML で対象の EditText の android:inputType 属性を textEnableTextConversionSuggestion に設定します。
android:inputType
textEnableTextConversionSuggestion
<com.example.android.tiramisudemo.ui.conversion.MyEditText android:id="@+id/edit" android:layout_width="match_parent" android:layout_height="wrap_content" android:inputType="text|textEnableTextConversionSuggestions" />
<com.example.android.tiramisudemo.ui.conversion.MyEditText
android:id="@+id/edit"
android:inputType="text|textEnableTextConversionSuggestions" />
カスタムの InputConnection を実装します。このために Android には InputConnectionWrapper というクラスが用意されています。setComposingText(CharSequence, int, TextAttribute) をオーバーライドして、実行中の変換候補にアクセスします。TextAttribute.getTextConversionSuggestions メソッドを使えば文字列のリストとして変換候補を取得できます。
InputConnectionWrapper
setComposingText(CharSequence, int, TextAttribute)
TextAttribute.getTextConversionSuggestions
class MyInputConnection( inputConnection: InputConnection?) : InputConnectionWrapper(inputConnection, false) { override fun setComposingText( text: CharSequence, newCursorPosition: Int, textAttribute: TextAttribute? ): Boolean { if (textAttribute != null) { val suggestions: List<String> = textAttribute.textConversionSuggestions // ここで suggestions (変換候補) から検索文字列を作る } return super.setComposingText(text, newCursorPosition, textAttribute) }}
class MyInputConnection(
inputConnection: InputConnection?
) : InputConnectionWrapper(inputConnection, false) {
override fun setComposingText(
text: CharSequence,
newCursorPosition: Int,
textAttribute: TextAttribute?
): Boolean {
if (textAttribute != null) {
val suggestions: List<String> = textAttribute.textConversionSuggestions
// ここで suggestions (変換候補) から検索文字列を作る
return super.setComposingText(text, newCursorPosition, textAttribute)
これで未確定の変換候補が取得できました。後はこの変換候補からそれぞれのアプリに即した検索クエリーを作って検索してください。注意する点として、この setComposingText で取得できるのはあくまで変換動作中のテキストです。EditText に確定済みのテキストが既に含まれる場合、連結する必要があります。それらの動作を含んだ詳細なコードは Text サンプルを参照してください。
setComposingText
Posted by Yuichi Araki - Developer Relations Team