2017-08-13 33 views
1

Androidアプリケーションのライフサイクルについて学ぶためにAndroid Studioでサンプルアプリケーションを作成しました。オリエンテーションの変更によってアクティビティが完全に再開されることがわかります(つまり、OnCreateメソッドが再び呼び出されます)。 私が知る限り、向きを変えるとコンテキストが破壊され、デバイスの回転後に空白のテキストが表示されるはずです。しかし、何らかの形で、onSaveInstanceStateメソッドとonRestoreInstanceStateメソッドをオーバーライドせずに、コンテキストを保存しています。EditTextはデバイス回転後の値を自動的に保存しました

私は断片を持っていません。 Androidスタジオで提供されている基本的なテンプレートで、オーバーライドされたライフサイクルメソッドはほとんどありません。 ここに私のMainActivityクラスです:

package com.example.android.a2_screen_orientation_change; 

import android.os.Bundle; 
import android.support.v7.app.AppCompatActivity; 
import android.util.Log; 

public class MainActivity extends AppCompatActivity { 

    private static final String TAG = MainActivity.class.getSimpleName(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
    } 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     Log.i(TAG, "in method onStart"); 
    } 

    @Override 
    protected void onResume() { 
     super.onResume(); 
     Log.i(TAG, "in method onResume"); 
    } 

    @Override 
    protected void onRestart() { 
     super.onRestart(); 
     Log.i(TAG, "in method onRestart"); 
    } 

    @Override 
    protected void onPause() { 
     super.onPause(); 
     Log.i(TAG, "in method onPause"); 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     Log.i(TAG, "in method onStop"); 
    } 

    @Override 
    protected void onDestroy() { 
     super.onDestroy(); 
     Log.i(TAG, "in method onDestroy"); 
    } 
} 

レイアウト:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.android.a2_screen_orientation_change.MainActivity"> 

    <EditText 
     android:id="@+id/editText" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

AbdroidManifest:

<?xml version="1.0" encoding="utf-8"?> 
<manifest xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.example.android.a2_screen_orientation_change"> 

    <application 
     android:allowBackup="true" 
     android:icon="@mipmap/ic_launcher" 
     android:label="@string/app_name" 
     android:roundIcon="@mipmap/ic_launcher_round" 
     android:supportsRtl="true" 
     android:theme="@style/AppTheme"> 
     <activity android:name=".MainActivity"> 
      <intent-filter> 
       <action android:name="android.intent.action.MAIN" /> 

       <category android:name="android.intent.category.LAUNCHER" /> 
      </intent-filter> 
     </activity> 
    </application> 

</manifest> 

画像: Text got saved even after device orientation change

+0

を参照してください?あなたの質問にそのような状態を親切に記載してください。 –

+0

待ち、スクリーンショットを追加します –

+0

'EditText'は保存された状態バンドルのテキストを自動的に保存/復元します。あなたはそれが起こるために何かをする必要はありません。 https://developer.android.com/reference/android/widget/TextView.html#setFreezesText(boolean)(「icicle」は保存された状態のバンドルの古い用語です) –

答えて

2

EditTextはフォーカスされたビューなので、PhoneWindowでは、saveHierarchyState()メソッドで自動的に状態が保存されます。あなたがXMLファイルにEditTextViewのIDを削除する場合は、だから、

@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; 
} 

@Override 
public Bundle saveHierarchyState() { 
    Bundle outState = new Bundle(); 
    if (mContentParent == null) { 
     return outState; 
    } 
    SparseArray<Parcelable> states = new SparseArray<Parcelable>(); 
    mContentParent.saveHierarchyState(states); 
    outState.putSparseParcelableArray(VIEWS_TAG, states); 
    // save the focused view id 
    View focusedView = mContentParent.findFocus(); 
    if (focusedView != null) { 
     if (focusedView.getId() != View.NO_ID) { 
      outState.putInt(FOCUSED_ID_TAG, focusedView.getId()); 
     } else { 
      if (false) { 
       Log.d(TAG, "couldn't save which view has focus because the focused view " 
         + focusedView + " has no id."); 
      } 
     } 
    } 
    // save the panels 
    SparseArray<Parcelable> panelStates = new SparseArray<Parcelable>(); 
    savePanelState(panelStates); 
    if (panelStates.size() > 0) { 
     outState.putSparseParcelableArray(PANELS_TAG, panelStates); 
    } 
    if (mActionBar != null) { 
     outState.putBoolean(ACTION_BAR_TAG, mActionBar.isOverflowMenuShowing()); 
    } 
    return outState; 
} 

TextViewのコード:あなたは、コードを見ることができ

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    tools:context="com.example.android.a2_screen_orientation_change.MainActivity"> 

    <EditText 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

</LinearLayout> 

必要になりますあなたが欲しいものを参照してください! (@マイクM.からサプリメント用タンク)

+0

ありがとう、私はそれを試して、それは働いた。 面白い振る舞い! –

+0

IDを削除すると、 'EditText'はテキストを保存しませんが、あなたが参照した' saveHierarchyState() 'メソッドはそれとは関係ありません。 'EditText'に関する限り、そのメソッドはIDを保存しているので、階層が復元されるときにフォーカスが与えられます。テキストでは何もしません。 –

+0

@MikeM。あなたの正しいおかげで本当です! – vesper

1

のAndroidは、いくつかの状態を復元、デフォルトでありますビュー。 レイアウトxmlに、EditTextにandroid:saveEnabled="false"を追加します。 EditTextの値は保持されません。

+0

オリエンテーションの変更後にテキストが失われたチュートリアルがいくつか見受けられました。 新しいバージョンのAndroidではこのデフォルトの動作が追加されていますか? –

+0

Androidリファレンスによると、この動作はデフォルトから変更されていないようです。しかし、ビューのデータをリフレッシュ(クリア)する場合は、この属性をfalseに設定する必要があります。 https://developer.android.com/reference/android/R.attr.html#saveEnabled –

1

Androidは自動的にあなたが明示的ケースであなたのmainifest

android:configChanges="orientation" 

を指定するまで復元状態&を保存処理し、あなたはIDを持っていませんui要素の場合、Androidは要素の状態を復元できません。

状態は振り出しに戻っていないことを考えるようにあなたをリードして何この活動について、ここで答え https://stackoverflow.com/a/19234974/1099156

関連する問題