屏幕旋转后片段不保留EditText值

时间:2018-01-22 10:41:47

标签: android android-fragments

我已经发布了一次这个问题,甚至尝试了所有可能的解决方案。所以,如果要进行投票,请至少提供正确的答案,因为我已经尝试了许多解决方案,但没有任何工作正在进行中。

在我的应用程序中,我在片段内部有一个EditText,它在方向改变时失去了它的价值。另外一件事,我正在为不同的方向使用不同的布局。有没有办法保留片段数据?我再次提到“片段数据”。请在下面找到我的片段代码以供进一步参考。

 @Override
public void onSaveInstanceState(Bundle outState) {

    outState.putString("fname",etxt_firstname.getText().toString());
    outState.putString("lname",etxt_lastname.getText().toString());
    super.onSaveInstanceState(outState);
}
@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    // retain this fragment
    setRetainInstance(true);
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
    if(savedInstanceState!= null)
    {
        etxt_firstname.setText(savedInstanceState.getString("fname"));
        etxt_lastname.setText(savedInstanceState.getString("lname"));
    }

}

在OnCreateView()中:

 @Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment
    shrp_sharedpreferences = myContext.getSharedPreferences("shrp", Context.MODE_PRIVATE);
    View view = null;

    if(!isTablet(myContext))
    {
        if(getResources().getConfiguration().orientation == Configuration.ORIENTATION_LANDSCAPE)
        {
            view =  inflater.inflate(R.layout.fragment_home_landscape, container, false);
        }
        else
        {
             view =  inflater.inflate(R.layout.fragment_home, container, false);

        }
    }
    else
    {
        view =  inflater.inflate(R.layout.fragment_home, container, false);
    }

1 个答案:

答案 0 :(得分:0)

即使片段本身被保留,当设备在onDestroyView()中旋转时,其视图也会被破坏(您还应该清除对视图的任何引用以防止泄漏旧方向)。

尝试恢复onActivityCreated()中的文字无效,因为您从旧方向引用了视图,而且它们已不再使用。

当重新附加片段时(在为新方向创建的Activity中),在onCreateView()中创建新的视图 - 您可以使用savedInstanceState或任何片段字段将视图恢复到以前的状态:< / p>

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // (...) your layout inflation and view binding logic...

    if(savedInstanceState != null){
        etxt_firstname.setText(savedInstanceState.getString("fname"));
        etxt_lastname.setText(savedInstanceState.getString("lname"));
    }
    // return view you inflated
}