奇怪的行为:TextView的getText()方法重新调整的对象的类类型在创建TextView的AccessibilityNodeInfo后发生更改

Nis*_*hah 5 android textview android-layout

我有一个带有文本"Hello World!"的TextView.在布局xml中定义

TextView textView = (TextView)findViewById(R.id.textView);
Run Code Online (Sandbox Code Playgroud)

TextView的getText()方法返回Class java.lang.String的对象

//Returns object of String class
Toast.makeText(getApplicationContext(), textView.getText().getClass().getName(), Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)

如果在创建AccessibilityNodeInfo之后调用它,则返回android.text.SpannableString的对象

//Creating AccessibilityNodeInfo
AccessibilityNodeInfo info = textView.createAccessibilityNodeInfo();

//Returns object of SpannableString
Toast.makeText(getApplicationContext(), "After creating AccessibilityNodeInfo: " + textView.getText().getClass().getName(), Toast.LENGTH_LONG).show();
Run Code Online (Sandbox Code Playgroud)

如何创建与getText()方法返回的对象相关的AccessibilityNodeInfo?

注意: 这仅在Android 4.3及更高版本中发生

Man*_*ani 3

这是由于添加了selectcutcopy等新功能。它是在 Android 4.3 中引入的,并在此处进行了记录。pasteAccessibilityNodeInfo

选择文本并复制/粘贴

AccessibilityNodeInfo 现在提供允许 AccessibilityService 在节点中选择、剪切、复制和粘贴文本的 API。

要指定要剪切或复制的文本选择,您的辅助服务可以使用新操作 ACTION_SET_SELECTION,并通过 ACTION_ARGUMENT_SELECTION_START_INT 和 ACTION_ARGUMENT_SELECTION_END_INT 传递选择的开始和结束位置。或者,您可以通过使用现有操作 ACTION_NEXT_AT_MOVMENT_GRANULARITY(以前仅用于移动光标位置)操作光标位置并添加参数 ACTION_ARGUMENT_EXTEND_SELECTION_BOOLEAN 来选择文本。

然后,您可以使用 ACTION_CUT、ACTION_COPY 剪切或复制,然后使用 ACTION_PASTE 粘贴。

注意:这些新 API 也可通过 Android 支持库和 AccessibilityNodeInfoCompat 类用于以前版本的 Android。

要实现该select功能,styleable/markup对象需要附加到底层文本。因此,文本类型从 更改StringSpannableString

这是引入此功能的View.java代码。以下代码将类型更改为SpannableString.

@Override
public CharSequence getIterableTextForAccessibility() {
    if (!(mText instanceof Spannable)) {
        setText(mText, BufferType.SPANNABLE);
    }
    return mText;
}
Run Code Online (Sandbox Code Playgroud)