无法在短信横屏界面收件人控件中复制粘贴
[DESCRIPTION]
1.打开短信,并新建短信
2.从联系人中选择联系人作为收件人
3.点击收件人空白区域弹出编辑框
4.长按文本,通过Edit按钮选择复制、粘贴、剪切等功能
[Expected result]
希望可以进行复制、粘贴、剪切等功能。
[SOLUTION]
为平台限制,分析如下:
一般TextView在Cursor移动或是选取了一段范围时会执行一个callback function
onSelectionChanged
在MMS中收件人处使用的是RecipientEditTextView,Google原本设计RecipientEditTextView的行为是一旦文字形成chip之后就不允许做选取,在
onSelectionChanged中一旦发现Cursor试图移动到Chip前面,就会强制把Cursor的位置移到最后面去
Android原本设计,如果一个EditText在focus中将手机由直屏转横屏,InputMethodService会主动弹出一个由ExtractEditText +键盘组成的全屏接
口,让用户输入时可以看得比较清楚不会被键盘挡住
ExtractEditText的内容是将背后的RecipientEditTextView的内容反馈出来,实际上此时做的任何操作(输入文字、删除文字、剪下、贴上等等),改
变的都是背后的RecipientEditTextView,而RecipientEditTextView发现内容改变了,便会通知ExtractEditText去改变内容,让前后的内容同步
在ExtractEditText做选取时RecipientEditTextView也会被通知,但由于RecipientEditTextView在onSelectionChanged会把Cursor强制移到最后面
去,所以事实上选取区域是甚么东西都没选到(因为此时selectStart == selectEnd)
目前Android的设计,ExtractEditText并不会被通知背后RecipientEditTextView的选取范围改变了,所以依然保持着自己的选取范围
而ExtractEditText发现有文字被选取了,就会启动文字编辑功能(全选、剪切、复制等),但事实上真正的选取范围是空的,所以执行这些功能都会
无效
结论:
这个现象是Android原本的设计所导致
ExtractEditText是存在在另外一个process, RecipientEditTextView并不知道它的存在,如果要修正这个问题需要让RecipientEditTextView在选
取区域改变时要想办法通知ExtractEditText把其选取区域做同步更新,这种架构上的改变会伴随比较高的风险,故不建议变更。
1.打开短信,并新建短信
2.从联系人中选择联系人作为收件人
3.点击收件人空白区域弹出编辑框
4.长按文本,通过Edit按钮选择复制、粘贴、剪切等功能
[Expected result]
希望可以进行复制、粘贴、剪切等功能。
[SOLUTION]
为平台限制,分析如下:
一般TextView在Cursor移动或是选取了一段范围时会执行一个callback function
onSelectionChanged
在MMS中收件人处使用的是RecipientEditTextView,Google原本设计RecipientEditTextView的行为是一旦文字形成chip之后就不允许做选取,在
onSelectionChanged中一旦发现Cursor试图移动到Chip前面,就会强制把Cursor的位置移到最后面去
Android原本设计,如果一个EditText在focus中将手机由直屏转横屏,InputMethodService会主动弹出一个由ExtractEditText +键盘组成的全屏接
口,让用户输入时可以看得比较清楚不会被键盘挡住
ExtractEditText的内容是将背后的RecipientEditTextView的内容反馈出来,实际上此时做的任何操作(输入文字、删除文字、剪下、贴上等等),改
变的都是背后的RecipientEditTextView,而RecipientEditTextView发现内容改变了,便会通知ExtractEditText去改变内容,让前后的内容同步
在ExtractEditText做选取时RecipientEditTextView也会被通知,但由于RecipientEditTextView在onSelectionChanged会把Cursor强制移到最后面
去,所以事实上选取区域是甚么东西都没选到(因为此时selectStart == selectEnd)
目前Android的设计,ExtractEditText并不会被通知背后RecipientEditTextView的选取范围改变了,所以依然保持着自己的选取范围
而ExtractEditText发现有文字被选取了,就会启动文字编辑功能(全选、剪切、复制等),但事实上真正的选取范围是空的,所以执行这些功能都会
无效
结论:
这个现象是Android原本的设计所导致
ExtractEditText是存在在另外一个process, RecipientEditTextView并不知道它的存在,如果要修正这个问题需要让RecipientEditTextView在选
取区域改变时要想办法通知ExtractEditText把其选取区域做同步更新,这种架构上的改变会伴随比较高的风险,故不建议变更。