問題現(xiàn)象:
復(fù)制 WebView 的文本(其實(shí)重點(diǎn)是多個(gè)段落) -> 粘貼 到輸入框儿倒;
嘗試復(fù)制輸入框里面的文本(全選版保、復(fù)制)呜笑,應(yīng)用拋出異常:
2018-11-01 11:18:29.519 21987-21987/xxx.xxx.xx E/MtaSDK.CaughtExp: java.lang.RuntimeException: PARAGRAPH span must end at paragraph boundary (62 follows )
at android.text.SpannableStringInternal.setSpan(SpannableStringInternal.java:171)
at android.text.SpannableStringInternal.copySpans(SpannableStringInternal.java:68)
at android.text.SpannableStringInternal.<init>(SpannableStringInternal.java:43)
at android.text.SpannedString.<init>(SpannedString.java:30)
at android.text.method.ReplacementTransformationMethod$SpannedReplacementCharSequence.subSequence(ReplacementTransformationMethod.java:180)
at android.widget.TextView.getTransformedText(TextView.java:9529)
at android.widget.TextView.onTextContextMenuItem(TextView.java:9484)
at android.widget.Editor$TextActionModeCallback.onActionItemClicked(Editor.java:4031)
at com.android.internal.policy.DecorView$ActionModeCallback2Wrapper.onActionItemClicked(DecorView.java:2393)
at com.android.internal.view.FloatingActionMode$3.onMenuItemSelected(FloatingActionMode.java:88)
at com.android.internal.view.menu.MenuBuilder.dispatchMenuItemSelected(MenuBuilder.java:761)
at com.android.internal.view.menu.MenuItemImpl.invoke(MenuItemImpl.java:152)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:904)
at com.android.internal.view.menu.MenuBuilder.performItemAction(MenuBuilder.java:894)
at com.android.internal.view.FloatingActionMode$4.onMenuItemClick(FloatingActionMode.java:114)
at com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup$3.onClick(FloatingToolbar.java:398)
at android.view.View.performClick(View.java:5642)
at android.view.View$PerformClick.run(View.java:22485)
at android.os.Handler.handleCallback(Handler.java:751)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6211)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:903)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:793)
其實(shí)我覺得跟應(yīng)用沒關(guān)系,奈何有的手機(jī)有問題彻犁,有的沒有問題叫胁。而且分析了一下,只要文本跨段落汞幢,就會(huì)有問題驼鹅,所以還是嘗試著解決。
問題原因:其實(shí)網(wǎng)上有介紹森篷,就是文本包含段落输钩,但是不是以換行結(jié)尾。
我 debug 的時(shí)候發(fā)現(xiàn)仲智,如果輸入框設(shè)置了單行輸入买乃,復(fù)制段落到 TextEdit 里面的時(shí)候,文本會(huì)保留 "\n"钓辆,只不過顯示的時(shí)候系統(tǒng)做了處理剪验。參見“SingleLineTransformationMethod”。
解決方法:既然是文本包含 "\n" 的原因前联,那就想辦法把 "\n" 替換掉吧功戚。
我的辦法是給 EditText 增加一個(gè) InputFilter ,替換掉 "\n"似嗤。
在調(diào)用過 super 的構(gòu)造方法后添加啸臀。因?yàn)?TextView 會(huì)根據(jù) XML 里面的 maxLength 添加一個(gè) InputFilter.LengthFilter(maxlength),不能覆蓋掉双谆。
private void addReplaceEndOfLineFilter() {
InputFilter replaceEndOfLineFilter = new InputFilter() {
@Override
public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) {
if (source == null) {
return null;
}
source = source.toString().replaceAll("\n", " ");
return source;
}
};
InputFilter[] filters = getFilters();
List<InputFilter> filtersList = new ArrayList<>();
if (filters != null) {
filtersList.addAll(Arrays.asList(filters));
}
filtersList.add(replaceEndOfLineFilter);
setFilters(filtersList.toArray(filters));
}