7

Edittext有什么特别的地方,它可以保留值,但不是Textview和其他一些小部件,我们必须为它们使用onSavedInstance()方法。EditText如何在电话方向更改时保留其值而不是textview?

EditText的特殊之处在于它可以保留这些值吗?

如果有人能说出它是如何在内部工作的。

< ----更新---->

它的内部工作原理,请指向这也解释了此方案中的那部分代码。

+0

是你通过代码设置TextView的值吗? – Atrix1987 2013-03-21 10:44:56

+0

我不问如何保留它,但它是如何由android自动处理的? – 2013-03-21 10:46:28

+0

其实它会...或者你试图说点别的吗?/ – Kiran 2013-03-21 10:46:38

回答

5

从这篇文章中引用:http://tekeye.biz/2012/saving-activity-state

“从纵向切换设备为横向导致Android的停止和重新启动的活动,使活动的机会,重绘屏幕为不同尺寸随着停止和启动一个活动。如果输入保持丢失,常见的用户会感到恼火Android有一对叫做onSaveInstanceState(Bundle)和onRestoreInstanceState(Bundle)的方法,View自动使用它们来保存它们的数据。因此需要EditText有一个id,这个方法对可以在一个Activity中重写,这样也可以保存和恢复与输入字段无关的状态变量。 “

从一个EditText删除ID和尝试:)

+0

Textview和edittext都是最初的mFreeze为false。但Edittext保持状态。但Textview不维护状态。这是怎么发生的? – 2016-01-11 10:18:38

8

什么是落后的EditText神奇的特殊,它可以保留 值?它如何在内部工作,请指出代码 的部分解释这种情况。

它是带来差异的可选属性。 TextView.onSaveInstanceState中的以下if条件会处理它。

@Override 
public Parcelable onSaveInstanceState() { 
    Parcelable superState = super.onSaveInstanceState(); 

    // Save state if we are forced to 
    boolean save = mFreezesText; 
    int start = 0; 
    int end = 0; 

    if (mText != null) { 
     start = getSelectionStart(); 
     end = getSelectionEnd(); 
     if (start >= 0 || end >= 0) { 
      // Or save state if there is a selection 
      save = true; 
     } 
    } 

    ... 
} 

默认情况下,TextView不能被选择。因此,getSelectionStart()getSelectionEnd()返回-1,由save变量保存假值。要使其在方向更改时保留其内容,请将属性textIsSelectable设置为true。

EditText由于是默认选择的,getSelectionStart()getSelectionEnd()总是由save变量的返回值> = 0,有保持真值和该内容被保存。

注意:默认情况下,freezesText已禁用。因此mFreezesText值是错误的。

+0

你能解释为什么当'textIsSelectable'为true时,getSelectionStart()和getSelectionEnd()总是返回值> = 0吗?我的意思是,如果文本是可选的,但没有选择,两个方法都不应该返回-1吗? – curioustechizen 2014-11-03 11:26:50

+0

@curioustechizen如果未选择文本,则选择开始和结束将为0,这表示未选择任何文本。这与将光标置于第0个索引处相同,如EditText的情况。这是[place](http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.4.4_r1/android/text/method/ArrowKeyMovementMethod.java?av = f#302)它被设置为0. – 2014-11-03 12:46:32

+0

嗯..这是令人困惑的。你链接的代码似乎与javadocs相矛盾。具体来说,'TextView#getSelectionStart()'指向'android.text.Selection#getSelectionStart()'。 javadocs为后者状态:'返回选择锚点或游标的偏移量,如果没有选择或游标,则返回-1。' – curioustechizen 2014-11-03 13:06:05

3

默认情况下,EditText视图保存其状态 - 这是通过在代码中设置标志来告诉视图在视图不可见或失去焦点时保存状态来实现的。旋转设备后,文本会自动保存并恢复。鉴于的EditText状态的自动保存可以在XML布局文件中设置了android禁用:saveEnabled属性设置为false:

android:saveEnabled="false" 

或以编程方式,调用view.setSaveEnabled(false)

saveEnabled控制是否启用保存此视图的状态(即,是否调用其onSaveInstanceState()方法)。请注意,即使启用了冻结,视图仍然必须为其状态分配一个ID(通过setId())以保存其状态。这个标志只能禁止保存这个视图;任何子视图可能仍保存其状态。 saveEnabled属性是android查看 - View Code的一部分。代码下面是相关的部分:

public boolean isSaveEnabled() { 
     return (mViewFlags & SAVE_DISABLED_MASK) != SAVE_DISABLED; 
    } 

...

public void setSaveEnabled(boolean enabled) { 
     setFlags(enabled ? 0 : SAVE_DISABLED, SAVE_DISABLED_MASK); 
    } 

...

void setFlags(int flags, int mask) { 
     int old = mViewFlags; 
     mViewFlags = (mViewFlags & ~mask) | (flags & mask); 

     int changed = mViewFlags^old; 
     if (changed == 0) { 
      return; 
     } 
     int privateFlags = mPrivateFlags; 

     /* Check if the FOCUSABLE bit has changed */ 
     if (((changed & FOCUSABLE_MASK) != 0) && 
       ((privateFlags & HAS_BOUNDS) !=0)) { 
      if (((old & FOCUSABLE_MASK) == FOCUSABLE) 
        && ((privateFlags & FOCUSED) != 0)) { 
       /* Give up focus if we are no longer focusable */ 
       clearFocus(); 
      } else if (((old & FOCUSABLE_MASK) == NOT_FOCUSABLE) 
        && ((privateFlags & FOCUSED) == 0)) { 
       /* 
       * Tell the view system that we are now available to take focus 
       * if no one else already has it. 
       */ 
       if (mParent != null) mParent.focusableViewAvailable(this); 
      } 
     } 

....

1

试试这个你TextView的,我认为它可以帮到你

<TextView 
... 
android:freezesText="true" /> 
0

Android设备上查看课堂上所保护的方法

protected Parcelable onSaveInstanceState() 
protected void onRestoreInstanceState (Parcelable state) 

所以任何视图可以覆盖这些方法和保存视图状态的信息与他们。

TextView扩展View类并实现受保护的Parcelable onSaveInstanceState()并保护其中的onRestoreInstanceState(Parcelable状态)。

让我们来看看实现的onSaveInstanceState()的

@Override 
public Parcelable onSaveInstanceState() 
{ 
    Parcelable superState = super.onSaveInstanceState(); 

    // Save state if we are forced to 
    boolean save = mFreezesText; 
    int start = 0; 
    int end = 0; 

    if (mText != null) 
    { 
     start = getSelectionStart(); 
     end = getSelectionEnd(); 
     if (start >= 0 || end >= 0) 
     { 
      // Or save state if there is a selection 
      save = true; 
     } 
    } 
    ... 
} 
  1. ,你可以在这里看到保存功能是依赖于单一的标志“保存” 因此,如果用户明确指定mFreezesText = true,那么将节省 文本
  2. 另一种可能性,如果有选择游标,那么它至少会返回getSelectionStart()= 0而不是-1,这将导致TextView使save = true来保存TextView的状态,这就是EditText发生EditText时发生的事情选择下载或者它确实扩展了TextView。
相关问题