java - 将 EditText 保存在 bundle 中并在布局更改时恢复它

标签 java android android-fragments fragment bundle

我为同一个 Fragment 创建了 2 个不同的布局。一个用于 Portrait,第二个用于 Landscape。我有一个 EditText 字段,如果我改变方向,我想传递它的内容,所以布局会切换。当 onViewCreated 被调用时,该值被保存并在 Log.d 中打印出来,但它没有在 EditText 字段中设置。 我还注意到,它只在第一次保存,并且在每次更改时, bundle 都会成倍增加。运行时的任何其他输入都将被忽略。

遵循:

02-07 10:26:15.100 9968-9968/parohyApps.antdiary D/NewData: Bundle string > hi
02-07 10:26:18.780 9968-9968/parohyApps.antdiary I/System.out: 2131492950
02-07 10:26:23.300 9968-9968/parohyApps.antdiary D/NewData: Bundle string > hi
02-07 10:26:23.340 9968-9968/parohyApps.antdiary D/NewData: Bundle string > hi
02-07 10:26:24.430 9968-9968/parohyApps.antdiary W/IInputConnectionWrapper: getExtractedText on inactive InputConnection
02-07 10:26:25.570 9968-9968/parohyApps.antdiary W/IInputConnectionWrapper: getExtractedText on inactive InputConnection
02-07 10:26:32.380 9968-9968/parohyApps.antdiary D/NewData: Bundle string > hi
02-07 10:26:32.400 9968-9968/parohyApps.antdiary D/NewData: Bundle string > hi
02-07 10:26:32.430 9968-9968/parohyApps.antdiary D/NewData: Bundle string > hi
02-07 10:26:32.550 9968-9968/parohyApps.antdiary I/Choreographer: Skipped 78 frames!  The application may be doing too much work on its main thread.

代码:

public class NewData extends Fragment {

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.new_data_layout, container, false);

    return view;
}

@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);

    if(savedInstanceState != null){
        Log.d("NewData", "Bundle string > " + savedInstanceState.getString("outString", "NO STRING"));
        EditText name = (EditText) view.findViewById(R.id.et_name);
        name.setText(savedInstanceState.getString("outString", 
                                                   "NO STRING"));
    }

}

@Override
public void onActivityCreated(Bundle savedInstanceState) {
    super.onActivityCreated(savedInstanceState);
}

@Override
public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    EditText name = (EditText) getActivity().findViewById(R.id.et_name);
    outState.putString("outString",name.getText().toString());
   }
}

最佳答案

我认为您需要将 fragment 保存在ActivityonSaveInstanceStateonRestoreInstanceState 中,例如:

保存 fragment

public void onSaveInstanceState(Bundle outState){
   getFragmentManager().putFragment(outState,"yourFragment",yourFragment);
}

恢复 fragment

public void onRestoreInstanceState(Bundle inState){
    yourFragment = getFragmentManager().getFragment(inState,"yourFragment");
}

关于java - 将 EditText 保存在 bundle 中并在布局更改时恢复它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35252349/

相关文章:

java - Android Ripple 效果在 fragment 内滞后

java - 使用 Java 中的方法检查二维 boolean 数组中的所有条目是否为真/假?

android - 在哪里可以下载用于 Android 和 Adob​​e AIR 开发的 air.app.AppEntry?

android - 如何在Android应用程序中访问谷歌开发者API

android - 使用 AsyncTask 从解析的 JSON 对象中设置文本

android - 无法将 Android map fragment 缩放到当前位置

java - 关闭在适配器内启动的 Activity 后如何刷新先前的 fragment ?

java - 等同于 Mortar 和 Flow 的 onActivityResult?

java - android 运行时错误 onResume()

java - 如何恢复 mysql 默认模式,如 sakila