簡體   English   中英

嘗試將兩個字符替換為一個字符時,應用程序崩潰。 一字符替換效果很好

[英]When trying to replace two character with one the application crashes. It works fine with one character replacement

我正在開發一個Android應用程序,因此很難用一個字符替換兩個字符。 它僅在替換一個字符時有效,但在同時用一個字符替換兩個字符時失敗。 我發現應用程序可以正確地用兩個新字符替換兩個字符。

您能幫我指出問題出在哪里以及如何解決我的代碼嗎?

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());

提前致謝。 這是我在本網站上的第一個問題。

下面是logcat

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");

字符串的長度將減少,因為您將2個字符替換為1個字符。 因此,使用原始字符串的長度調用setSelection()會導致超出范圍的錯誤,因為您試圖將光標移到字符串的末尾。

解決方案是在替換完成后,使用新字符串的長度調用setSelection():

setSelection(tvalue.length());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM