片段在屏幕旋转后不保留编辑文本值



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

在我的应用程序中,我在片段中有一个 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"));
    }
}

Inside 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);
    }
即使保留

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

尝试在 onActivityCreated() 中还原文本不会执行任何操作,因为您引用的是旧方向的视图,并且不再使用它们。

重新附加片段时(在为新方向创建的活动中(,将在onCreateView()中创建新视图 - 您可以在savedInstanceState或任何片段字段中将视图恢复到以前的状态:

@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
}

最新更新