美文网首页
TextView中onSaveInstanceState()方法

TextView中onSaveInstanceState()方法

作者: beforenight | 来源:发表于2017-06-12 11:29 被阅读55次

    TextView中onSaveInstanceState()方法

    @Override
    public Parcelable onSaveInstanceState() {
        Parcelable superState = super.onSaveInstanceState();
    
        // Save state if we are forced to
        final boolean freezesText = getFreezesText();
        boolean hasSelection = false;
        int start = -1;
        int end = -1;
    
        if (mText != null) {
            start = getSelectionStart();
            end = getSelectionEnd();
            if (start >= 0 || end >= 0) {
                // Or save state if there is a selection
                hasSelection = true;
            }
        }
    
        if (freezesText || hasSelection) {
            SavedState ss = new SavedState(superState);
    
            if (freezesText) {
                if (mText instanceof Spanned) {
                    final Spannable sp = new SpannableStringBuilder(mText);
    
                    if (mEditor != null) {
                        removeMisspelledSpans(sp);
                        sp.removeSpan(mEditor.mSuggestionRangeSpan);
                    }
    
                    ss.text = sp;
                } else {
                    ss.text = mText.toString();
                }
            }
    
            if (hasSelection) {
                // XXX Should also save the current scroll position!
                ss.selStart = start;
                ss.selEnd = end;
            }
    
            if (isFocused() && start >= 0 && end >= 0) {
                ss.frozenWithFocus = true;
            }
    
            ss.error = getError();
    
            if (mEditor != null) {
                ss.editorState = mEditor.saveInstanceState();
            }
            return ss;
        }
    
        return superState;
    }
    

    从上述源码可以看出,TextView保存了自己的文本选中状态和文本内容,并且通过查看器onRestoreInstanceState方法源码,可以发现它的确恢复了这些数据。

    TextView中onRestoreInstanceState源码

     @Override
    public void onRestoreInstanceState(Parcelable state) {
        if (!(state instanceof SavedState)) {
            super.onRestoreInstanceState(state);
            return;
        }
    
        SavedState ss = (SavedState)state;
        super.onRestoreInstanceState(ss.getSuperState());
    
        // XXX restore buffer type too, as well as lots of other stuff
        if (ss.text != null) {
            setText(ss.text);
        }
    
        if (ss.selStart >= 0 && ss.selEnd >= 0) {
            if (mText instanceof Spannable) {
                int len = mText.length();
    
                if (ss.selStart > len || ss.selEnd > len) {
                    String restored = "";
    
                    if (ss.text != null) {
                        restored = "(restored) ";
                    }
    
                    Log.e(LOG_TAG, "Saved cursor position " + ss.selStart +
                          "/" + ss.selEnd + " out of range for " + restored +
                          "text " + mText);
                } else {
                    Selection.setSelection((Spannable) mText, ss.selStart, ss.selEnd);
    
                    if (ss.frozenWithFocus) {
                        createEditorIfNeeded();
                        mEditor.mFrozenWithFocus = true;
                    }
                }
            }
        }
    
        if (ss.error != null) {
            final CharSequence error = ss.error;
            // Display the error later, after the first layout pass
            post(new Runnable() {
                public void run() {
                    if (mEditor == null || !mEditor.mErrorWasChanged) {
                        setError(error);
                    }
                }
            });
        }
    
        if (ss.editorState != null) {
            createEditorIfNeeded();
            mEditor.restoreInstanceState(ss.editorState);
        }
    }

    相关文章

      网友评论

          本文标题:TextView中onSaveInstanceState()方法

          本文链接:https://www.haomeiwen.com/subject/wfklqxtx.html