0

所以 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 中的编辑文本:

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

3 回答 3

2

当方向改变时,Activity 会被重新创建,这是正确的。但是,不需要处理 UI 元素的状态:

几乎 Android 框架中的每个小部件都适当地实现了此方法,以便在重新创建活动时自动保存和恢复对 UI 的任何可见更改。例如,EditText 小部件保存用户输入的任何文本,而 CheckBox 小部件保存它是否被选中。您需要做的唯一工作是为每个要保存其状态的小部件提供唯一 ID(带有 android:id 属性)。如果小部件没有 ID,则系统无法保存其状态。

来自:http: //developer.android.com/guide/components/activities.html#SavingActivityState

注意:如果您想保留 EditText 值,即使用户使用 BACK 按钮,您也需要一个持久网存储。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>
于 2012-09-17T14:36:23.633 回答
1

好的,所以我遇到了这个问题,因为我将带有 FragmentTransaction 的 Fragment 添加到 FrameLayout(具有唯一 ID)中。

现在,我再次在 XML 中使用唯一 ID 声明了我的 Fragment,它可以工作了。

如果容器具有唯一 ID,我无法真正解释为什么在使用 FragmentTransaction 添加它时它不起作用,但至少它现在起作用了。

于 2012-09-17T15:31:44.937 回答
0

确保 TextEdit 和 TextView 字段保留其内容的一种简单方法是设置它们的 freezesText 属性。

于 2018-09-25T01:16:17.467 回答