Android 为什么我的EditText不保存它的状态(主要是它的文本)?
因此,编辑文本应在更改方向时保存其文本。 在这个特定的片段中,他们没有。为什么呢 我的片段:Android 为什么我的EditText不保存它的状态(主要是它的文本)?,android,android-edittext,fragment,android-lifecycle,android-orientation,Android,Android Edittext,Fragment,Android Lifecycle,Android Orientation,因此,编辑文本应在更改方向时保存其文本。 在这个特定的片段中,他们没有。为什么呢 我的片段: public class LoginFragment extends Fragment { /** * @param inflater * @param container * @param savedInstanceState * @return * @see android.support.v4.app.Fragment#onCreate
public class LoginFragment extends Fragment {
/**
* @param inflater
* @param container
* @param savedInstanceState
* @return
* @see android.support.v4.app.Fragment#onCreateView(android.view.LayoutInflater,
* android.view.ViewGroup, android.os.Bundle)
*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.login, container, false);
}
/**
*
* @see android.support.v4.app.Fragment#onStart()
*/
@Override
public void onStart() {
super.onStart();
getView().findViewById(R.id.login_ok).setOnClickListener(
new OnClickListener() {
public void onClick(View v) {
startActivity(new Intent(getActivity(),
StartActivity.class));
}
});
}
}
我的编辑文本(xml):
<EditText
android:id="@+id/login_user"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="@drawable/roundedcorner"
android:ems="10"
android:hint="@string/email"
android:inputType="textEmailAddress"
android:padding="8dp" >
<requestFocus />
</EditText>
<EditText
android:id="@+id/login_pw"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="8dp"
android:background="@drawable/roundedcorner"
android:ems="10"
android:hint="@string/password"
android:inputType="textPassword"
android:padding="8dp" />
当方向改变时,活动会被重新创建,没错。 但是,不需要处理UI元素的状态: Android框架中的几乎每个小部件都适当地实现了这种方法,这样,在重新创建活动时,对UI的任何可见更改都会自动保存和恢复。例如,EditText小部件保存用户输入的任何文本,复选框小部件保存是否选中。您需要做的唯一工作是为每个要保存其状态的小部件提供一个唯一的ID(带有android:ID属性)。如果小部件没有ID,则系统无法保存其状态 发件人: 注意:如果要保留EditText值,即使用户使用“后退”按钮,也需要persistenet存储。不会调用onSaveInstanceState 下面是一个简单的示例(保留EditText值): XML文件
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_id"
android:name="com.example.fragementtest.EditFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
</LinearLayout>
方向改变时,活动会重新创建,没错。 但是,不需要处理UI元素的状态: Android框架中的几乎每个小部件都适当地实现了这种方法,这样,在重新创建活动时,对UI的任何可见更改都会自动保存和恢复。例如,EditText小部件保存用户输入的任何文本,复选框小部件保存是否选中。您需要做的唯一工作是为每个要保存其状态的小部件提供一个唯一的ID(带有android:ID属性)。如果小部件没有ID,则系统无法保存其状态 发件人: 注意:如果要保留EditText值,即使用户使用“后退”按钮,也需要persistenet存储。不会调用onSaveInstanceState 下面是一个简单的示例(保留EditText值): XML文件
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_id"
android:name="com.example.fragementtest.EditFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
</LinearLayout>
好的,所以我遇到了这个问题,因为我将带有FragmentTransaction的片段添加到FrameLayout(具有唯一ID)中 现在,我用一个唯一的ID在XML中再次声明了我的片段,它可以工作了
如果容器有一个唯一的ID,我真的无法解释为什么它在添加FragmentTransaction时不起作用,但至少它现在起作用了。好的,所以我遇到了这个问题,因为我将带有FragmentTransaction的片段添加到了FrameLayout(具有唯一ID)中 现在,我用一个唯一的ID在XML中再次声明了我的片段,它可以工作了
如果容器有唯一的ID,我真的无法解释为什么在使用FragmentTransaction添加时它不起作用,但至少它现在可以工作。确保TextEdit和TextView字段保留其内容的简单方法是设置其冻结文本属性。确保TextEdit和TextView字段保留其内容的简单方法是设置其冻结文本属性。如何将片段添加到活动中用xml声明,但现在我也尝试将其添加到框架布局的代码中。我会在一秒钟内发布代码,作为对我问题的编辑。我相信如果在xml中添加片段,它应该是非常无缝的。如何将片段添加到活动中?首先我用xml声明了它,但现在我也尝试在代码中将其添加到框架布局中。我会在一秒钟内发布代码,作为对我问题的编辑。我相信如果在xml中添加片段,它应该是非常无缝的。在这个特定的实例中,EditText值不会保存,即使在另一个活动中,文本保存没有问题。也许是因为这些文字有暗示?我已经用
setRetainInstance(true)
创建了一个解决方案,并将文本保存在类变量中,但这非常难看。您最好找到问题的原因。我猜你说的是屏幕上的日志。您确定没有使用“后退”按钮返回吗?尝试“切换”应用程序,而不是关闭它,然后查看即时状态是否工作。或者你可能又在某个地方覆盖了你的编辑文本?我同意,我应该找出他们为什么不这样做。我已经更新了我的问题。一切都恢复苗条,这些文本应该保存。但事实并非如此。我只是在纵向和横向模式之间切换,编辑文本又是空的。看看我上面的例子,它可以工作(刚刚在我的设备上测试过)。你的错误一定在别的地方。以示例代码为例,一步一步地添加自定义代码。谢谢,但我已经找到了至少适用于此片段的解决方案。看看我的答案。祝您一周愉快:)在这个特定的实例中,editText值不会保存,即使在另一个活动中,文本保存没有问题。也许是因为这些文字有暗示?我已经用setRetainInstance(true)
创建了一个解决方案,并将文本保存在类变量中,但这非常难看。您最好找到问题的原因。我猜你说的是屏幕上的日志。您确定没有使用“后退”按钮返回吗?尝试“切换”应用程序,而不是关闭它,然后查看即时状态是否工作。或者你可能又在某个地方覆盖了你的编辑文本?我同意,我应该找出他们为什么不这样做。我已经更新了我的问题。一切都恢复苗条,这些文本应该保存。但事实并非如此。我只是在纵向和横向模式之间切换,编辑文本又是空的。看看我上面的例子,它可以工作(刚刚在我的设备上测试过)。你的错误一定在别的地方。以示例代码为例,逐步添加您的自定义代码。谢谢,但我已经找到了一个解决方案,至少可以在f
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/fragment_id"
android:name="com.example.fragementtest.EditFragment"
android:layout_width="fill_parent"
android:layout_height="fill_parent" />
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:ems="10" >
</EditText>
</LinearLayout>