我在Android Studio中创建了一个示例应用程序,以了解Android应用程序的生命周期。我知道方向更改完全重新启动活动(即再次调用OnCreate方法)。 据我所知,方向改变应该破坏上下文并在设备旋转后显示空白文本。但不管怎么说,如果没有覆盖onSaveInstanceState和onRestoreInstanceState方法,它就会保存上下文。
我没有任何碎片。它只是Android studio提供的基本模板,几乎没有被覆盖的生命周期方法。 这是我的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>
答案 0 :(得分:2)
因为EditText是一个焦点视图,所以在PhoneWindow
中,它的状态将自动保存在saveHierarchyState()
方法中。你可以看到代码:
@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
中的代码:
@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;
}
因此,如果删除xml文件中EditTextView的id:
<?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>
你会看到你想要的! (来自@Mike M的补充坦克。)
答案 1 :(得分:1)
Android默认情况下,恢复某些视图的状态。
在Layout xml中,将android:saveEnabled="false"
添加到EditText。并且不会保留EditText的值。
答案 2 :(得分:1)
Android自动处理保存状态&amp;恢复,直到您明确指定
android:configChanges="orientation"
在你的主要内容
如果你没有ui元素的id,Android将无法恢复元素的状态。