因此EditTexts应该在更改方向时保存文本。 在这个特殊的片段中,他们不会。那是为什么?
我的片段:
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中的edittexts:
<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" />
这是我的活动的onCreate方法:
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
FragmentManager fm = getSupportFragmentManager();
FragmentTransaction ft = fm.beginTransaction();
ft.add(R.id.login_frame, new LoginFragment());
ft.commit();`
答案 0 :(得分:1)
当方向改变时,活动会重新创建,这是正确的。 但是,处理UI元素的状态不是必需的:
Android框架中的几乎每个窗口小部件都会根据需要实现此方法,以便在重新创建活动时自动保存和恢复对UI的任何可见更改。例如,EditText小部件保存用户输入的任何文本,CheckBox小部件保存是否已选中。您需要的唯一工作是为要保存其状态的每个小部件提供唯一的ID(带有android:id属性)。如果窗口小部件没有ID,则系统无法保存其状态。
自: http://developer.android.com/guide/components/activities.html#SavingActivityState
注意:如果要保留EditText值,即使用户使用BACK按钮,也需要一个persistenet存储。不会调用onSaveInstanceState。
这是一个简单的例子(保留了EditText值):
public class MainActivity extends FragmentActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.acitivty_main);
}
}
public class EditFragment extends Fragment {
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_edit, container);
}
}
.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>
答案 1 :(得分:1)
好的,所以我遇到了这个问题,因为我将带有FragmentTransaction的Fragment添加到FrameLayout(具有唯一ID)中。
现在我已经使用唯一ID在XML中再次声明了我的Fragment,它可以正常工作。
我无法解释为什么在使用FragmentTransaction添加它时它不起作用,如果容器具有唯一ID,但至少它现在可以正常工作。
答案 2 :(得分:0)
确保您的TextEdit和TextView字段保留其内容的一种简单方法是设置其FrozensText属性。