7

Edittextでは、Textviewやその他のウィジェットではなく、値を保持することができるため、onSavedInstance()メソッドを使用する必要があります。EditTextはどのように値を保持しますが、電話機の向きが変わるとテキストビューは表示されませんか?

EditTextの背後にある魔法は、特に値を保持できることは何ですか?

誰かが内部的にどのように動作するかを知ることができます。

< ----更新、それは内部的にどのように動作する---->

は、このシナリオを説明し、コードのその部分を指してください。この記事からの引用

+0

コードでTextViewの値を設定していますか? – Atrix1987

+0

私はそれを保持する方法を尋ねていませんが、それがアンドロイドによって自動的にどのように処理されるのですか? –

+0

実際にそれは...あなたは何か他のことを言おうとしていますか?/ – Kiran

答えて

5

http://tekeye.biz/2012/saving-activity-state

「風景に肖像画からデバイスを切り替えるには、活動に異なる寸法のために画面を再描画する機会をできるように、Androidは活動を停止して再起動する原因となる活動を停止して始まります。 Androidには、onSaveInstanceState(Bundle)とonRestoreInstanceState(Bundle)という2つのメソッドがあり、これらのメソッドはビューが自動的にデータを保存するために使用されます。したがって、EditTextにidを持たせる必要があります。このメソッドのペアは、入力フィールドに関連付けられていない状態変数も保存および復元できるように、アクティビティでオーバーライドすることができます。 "

のEditTextからIDを削除し、それを試してみてください:)

+0

Textviewとedittextはどちらも最初はmFreezeとしてfalseです。しかし、Edittextは状態を維持します。しかし、Textviewは状態を維持しません。これはどうして起こるのですか? –

8

のEditTextの背後にある魔法はそれが の値を保持できるという特別な何ですか?それが内部的にどのように働くか、このシナリオを説明するコード の部分を指してください。

違いをもたらすのは選択可能なプロパティです。次のifの状態はTextView.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; 
     } 
    } 

    ... 
} 

デフォルトでは、TextViewは選択できません。従ってgetSelectionStart()getSelectionEnd()-1を返します。そこにはsaveという変数がfalse値を保持しています。方向変更の内容を保持するには、属性textIsSelectableをtrueに設定します。 EditText以来

はデフォルトで選択され、getSelectionStart()getSelectionEnd()は常に値> = 0を返し、そこsave変数によって真の値を保持し、コンテンツが保存されます。

注:デフォルトでは、freezesTextは無効です。したがって、mFreezesTextの値はfalseです。

+0

'textIsSelectable'がtrueのときに' getSelectionStart() 'と' getSelectionEnd() 'が常にvalue> = 0を返す理由を説明できますか?つまり、テキストは選択可能ですが、何も選択されていない場合、両方のメソッドが-1を返すべきではありませんか? – curioustechizen

+0

@curioustechizenテキストが選択されていない場合、選択の開始と終了は0になり、テキストが選択されていないことを示します。EditTextの場合と同様に0番目のインデックスにカーソルを置くのと同じです。これは[場所]です(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に設定されています。 –

+0

うーん..これは混乱しています。あなたがリンクしたコードは、javadocsと矛盾しているようです。具体的には、 'TextView#getSelectionStart()'は 'android.text.Selection#getSelectionStart()'を指します。そして、後者の状態のjavadoc: '選択アンカーまたはカーソルのオフセットを返します。選択またはカーソルがない場合は-1を返します。 ' – curioustechizen

3

デフォルトでは、EditTextビューは状態を保存します。これは、ビューが表示されていないかフォーカスが失われているときにビューに保存状態を知らせるフラグでフラグを設定することで実現します。テキストはデバイスを回転した後に自動的に保存され、復元されます。 falseにsaveEnabledプロパティ::のEditTextビューの状態の自動保存は、Androidを設定することにより、XMLレイアウトファイルで無効にすることができます

android:saveEnabled="false" 

またはプログラム、view.setSaveEnabled(false)を呼び出します。

saveEnabledは、このビューの状態の保存が有効かどうか(つまり、そのonSaveInstanceState()メソッドが呼び出されるかどうか)を制御します。フリーズが有効になっていても、ステートを保存するためには(setId()を介して)ビューにIDが割り当てられている必要があります。このフラグは、このビューの保存のみを無効にすることができます。子ビューの状態は保存されている可能性があります。 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のViewクラスは、そのいずれかのビューがこれらのメソッドをオーバーライドして、彼らとビューの状態情報を保存することができる方法

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

を保護しています。

TextViewは、Viewクラスを拡張し、保護されたParcelable onSaveInstanceState()とprotected void 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. あなたは、保存機能、ここで見ることができるように、ユーザーが明示的にtrue = mFreezesTextを指定した場合ので、 「保存」単一のフラグに依存され、それは が保存されます
  2. 選択カーソルがある場合、少なくともgetSelectionStart()= 0を返し、TextViewがTextViewの状態を保存するためにTextViewを保存するようにします。そして、EditTextのようにEditTextで何が起こっているのでしょうか?選択カーソルまたはそれはTextViewを拡張します。
関連する問題