gpt4 book ai didi

android - 应用程序在方向更改时保存文本框状态?

转载 作者:行者123 更新时间:2023-11-29 15:14:42 25 4
gpt4 key购买 nike

我试图了解 Android 应用程序的总体流程,但遇到了我认为很奇怪的情况(注意:我对 Android 编程非常陌生)。

我制作了一个只有多行编辑文本字段的测试应用程序。我在字段上写了1234。没有其他任何东西,没有对默认的 Eclipse ADT 应用程序进行其他更改,也没有覆盖后端中的任何特定内容,我改变了方向。剩下 1234 人。然后我按下主页按钮,然后从最近的应用程序中打开它。剩下 1234 个。

我对应用程序生命周期的理解是,当按下主页按钮时应用程序停止和启动,当应用程序的方向改变时应用程序被销毁和创建。如果这是正确的,是否会发生某种形式的自动状态保持?我假设我必须从状态包中提取单个变量并自己恢复它们。这不对吗?

经验丰富的 Android 开发人员对此的任何解释都很棒。我一直在努力寻找合适的答案,但无济于事。

MainActivity.java

package com.example.teststate;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;


public class MainActivity extends Activity {

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


@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}

Activity_Main.xml

<RelativeLayout 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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.teststate.MainActivity" >

<EditText
android:id="@+id/editText1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true"
android:layout_marginTop="30dp"
android:ems="10"
android:inputType="textMultiLine" >

<requestFocus />
</EditText>

</RelativeLayout>

来自 Manifest.xml 的 fragment

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

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

谢谢!

最佳答案

发生这种情况的原因是因为 View 通过覆盖 View#onSaveInstanceState() 显式地保存和恢复方向更改时的状态。和 View#onRestoreInstanceStance(Parcelable) .这是 TextView(EditText 的父类(super class))

中的实现
@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;
}
}

if (save) {
SavedState ss = new SavedState(superState);
// XXX Should also save the current scroll position!
ss.selStart = start;
ss.selEnd = end;

if (mText instanceof Spanned) {
Spannable sp = new SpannableStringBuilder(mText);

if (mEditor != null) {
removeMisspelledSpans(sp);
sp.removeSpan(mEditor.mSuggestionRangeSpan);
}

ss.text = sp;
} else {
ss.text = mText.toString();
}

if (isFocused() && start >= 0 && end >= 0) {
ss.frozenWithFocus = true;
}

ss.error = getError();

return ss;
}

return superState;
}

[...]

@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() {
setError(error);
}
});
}
}

如您所见,它将状态保存在 Parcelable 对象中,然后将其传递给新实例中具有相同 android:id 的 View ,并且 onRestoreInstanceState() 在新 View 上被调用。如果您创建一个自定义 View ,它不仅仅包含其他 View ,您可能希望重写这些方法。

关于android - 应用程序在方向更改时保存文本框状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25775298/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com