【问题标题】:Saving EditText in bundle and restoring it on layout change将 EditText 保存在 bundle 中并在布局更改时恢复它
【发布时间】:2016-02-07 10:34:29
【问题描述】:

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

后续:

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());
   }
}

【问题讨论】:

  • 你试过onRestoreInstanceState()
  • 根据文档,当 Activity 或 Fragment 被操作系统/用户关闭/杀死并重新打开时调用它。现在你建议,我试过了,但是当我从肖像>风景改变时它没有被调用。
  • 我认为你必须将你的片段保存在活动的 onSavedInstanceState 和 onRestoreInstanceState 中
  • 好的兄弟我会把它添加为答案..

标签: java android android-fragments fragment bundle


【解决方案1】:

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

保存片段

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

恢复片段

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

【讨论】:

  • 它不会接受片段。我有android.app.FragmentpuFragment() 需要android.support.v4.app.Fragment。尝试在 NewData 片段中导入 android.support.v4.app.Fragmen,但 FragmentTransaction 抱怨类型。
  • 你试过getSupportFragmentManager().putFragment。你确定你的 Activity 扩展了 ActionBarActivity 吗?
  • 没有。我的活动扩展了AppCompatActivity,其中包含片段
  • 已弃用没关系。我认为您正在将支持包与非支持包结合起来,从而导致不兼容的错误。请重新检查您的片段和活动。在任何地方都使用相同的。要么在任何地方使用支持片段,要么只使用片段。我现在要离开了。如果您再次遇到同样的问题,请发表评论。我稍后会赶上。
  • 我设法使用了 v4 片段。这是工作。感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-04
  • 2013-04-25
相关资源
最近更新 更多