Java 当试图用一个字符替换两个字符时,应用程序崩溃。只需替换一个字符就可以了
我正在开发一个Android应用程序,我很难用一个字符替换两个字符。 当只替换一个字符时,它工作,但当同时用一个字符替换两个字符时失败。 我发现应用程序可以正确地用两个新字符替换两个字符 您能帮我指出问题所在,以及如何修复代码吗Java 当试图用一个字符替换两个字符时,应用程序崩溃。只需替换一个字符就可以了,java,android,Java,Android,我正在开发一个Android应用程序,我很难用一个字符替换两个字符。 当只替换一个字符时,它工作,但当同时用一个字符替换两个字符时失败。 我发现应用程序可以正确地用两个新字符替换两个字符 您能帮我指出问题所在,以及如何修复代码吗 tt = new TextWatcher() { public void afterTextChanged(Editable s){ et.setSelection(s.length());
tt = new TextWatcher() {
public void afterTextChanged(Editable s){
et.setSelection(s.length()); }
public void beforeTextChanged(CharSequence s,int start,int count, int after){}
public void onTextChanged(CharSequence s, int start, int before, int count) {
et.removeTextChangedListener(tt);
String tvalue = et.getText().toString();
tvalue = tvalue.replaceAll("k", "1");;
tvalue = tvalue.replaceAll("1h", "2");
//THE first line replaces "k" with "1" WORKS FINE BUT THE second line for replacing "1h" with "2" DOES NOT. IT CRASHES. I found that it is possible to replace "1h" with "2 "(two followed by space)!
et.addTextChangedListener(tt);
}
};
et.addTextChangedListener(tt);
}
setSelection(s.length());
提前谢谢。这是我在这个网站上的第一个问题
下面是日志猫
02-02 09:39:27.674 838-838/in.healthy100.gujjuwriter E/MessageQueue-JNI﹕ java.lang.IndexOutOfBoundsException: setSpan (10 ... 10) ends beyond length 9
at android.text.SpannableStringBuilder.checkRange(SpannableStringBuilder.java:1016)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:592)
at android.text.SpannableStringBuilder.setSpan(SpannableStringBuilder.java:588)
at android.text.Selection.setSelection(Selection.java:76)
at android.text.Selection.setSelection(Selection.java:87)
at android.widget.EditText.setSelection(EditText.java:94)
at in.healthy100.gujjuwriter.MyActivity$1.onTextChanged(MyActivity.java:270)
at android.widget.TextView.sendOnTextChanged(TextView.java:7408)
at android.widget.TextView.handleTextChanged(TextView.java:7467)
at android.widget.TextView$ChangeWatcher.onTextChanged(TextView.java:9183)
at android.text.SpannableStringBuilder.sendTextChanged(SpannableStringBuilder.java:962)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:496)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:435)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:30)
at android.text.method.QwertyKeyListener.onKeyDown(QwertyKeyListener.java:223)
at android.text.method.TextKeyListener.onKeyDown(TextKeyListener.java:136)
at android.widget.TextView.doKeyDown(TextView.java:5532)
at android.widget.TextView.onKeyDown(TextView.java:5343)
at android.view.KeyEvent.dispatch(KeyEvent.java:2640)
at android.view.View.dispatchKeyEvent(View.java:7665)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at android.view.ViewGroup.dispatchKeyEvent(ViewGroup.java:1408)
at com.android.internal.policy.impl.PhoneWindow$DecorView.superDispatchKeyEvent(PhoneWindow.java:2035)
at com.android.internal.policy.impl.PhoneWindow.superDispatchKeyEvent(PhoneWindow.java:1505)
at android.app.Activity.dispatchKeyEvent(Activity.java:2418)
at com.android.internal.policy.impl.PhoneWindow$DecorView.dispatchKeyEvent(PhoneWindow.java:1962)
at android.view.ViewRootImpl$ViewPostImeInputStage.processKeyEvent(ViewRootImpl.java:3852)
at android.view.ViewRootImpl$ViewPostImeInputStage.onProcess(ViewRootImpl.java:3826)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3525)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
at android.view.ViewRootImpl$AsyncInputStage.apply(ViewRootImpl.java:3582)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
at android.view.ViewRootImpl$InputStage.apply(ViewRootImpl.java:3426)
at android.view.ViewRootImpl$InputStage.deliver(ViewRootImpl.java:3399)
at android.view.ViewRootImpl$InputStage.onDeliverToNext(ViewRootImpl.java:3449)
at android.view.ViewRootImpl$InputStage.forward(ViewRootImpl.java:3418)
at android.view.ViewRootImpl$AsyncInputStage.forward(ViewRootImpl.java:3558)
at android.view.ViewRootImpl$ImeInputStage.onFinishedInputEvent(ViewRootImpl.java:3718)
at android.view.inputmethod.InputMethodManager$PendingEvent.run(InputMethodManager.java:2010)
at android.view.inputmethod.InputMethodManager.invokeFinishedInputEventCallback(InputMethodManager.java:1704)
at android.view.inputmethod.InputMethodManager.finishedInputEvent(InputMethodManager.java:1695)
at android.view.inputmethod.InputMethodManager$ImeInputEventSender.onInputEventFinished(InputMethodManager.java:1987)
at android.view.InputEventSender.dispatchInputEventFinished(InputEventSender.java:141)
at android.os.MessageQueue.nativePollOnce(Native Method)
at android.os.MessageQueue.next(MessageQueue.j
02-02 09:39:27.674 838-838/in.healthy100.gujjuwriter D/AndroidRuntime﹕ Shutting down VM
这是导致错误的代码:
setSelection(s.length());
您正试图使用原始字符串的长度将光标设置到字符串的末尾。运行此代码时:
tvalue = tvalue.replaceAll("k", "1");
tvalue = tvalue.replaceAll("1h", "2");
字符串的长度不会更改,因此使用原始长度是可以的。但是,运行此代码时:
tvalue = tvalue.replaceAll("k", "1");
tvalue = tvalue.replaceAll("1h", "2");
字符串的长度将减少,因为您将用1个字符替换2个字符。因此,使用原始字符串的长度调用setSelection()将导致越界错误,因为您试图将光标移过字符串的末尾
解决方案是在替换完成后,使用新字符串的长度调用setSelection():
setSelection(tvalue.length());
有什么例外?分享你的日志请发送你的日志什么是你的日志,张贴在这里感谢快速评论。我是android studio的新手,不知道在哪里可以找到logcat。一旦我找到了logcat,我会发布它。谢谢