为什么我的EditText不保存其状态(主要是文本)?

时间:2012-09-17 11:46:34

标签: android android-edittext fragment android-lifecycle android-orientation

因此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();`

3 个答案:

答案 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属性。