Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/358.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何对片段使用onSaveInstanceState和onRestoreInstanceState方法?_Java_Android_Listview_Android Fragments_Onrestoreinstancestate - Fatal编程技术网

Java 如何对片段使用onSaveInstanceState和onRestoreInstanceState方法?

Java 如何对片段使用onSaveInstanceState和onRestoreInstanceState方法?,java,android,listview,android-fragments,onrestoreinstancestate,Java,Android,Listview,Android Fragments,Onrestoreinstancestate,我有两个片段。其中一个有一个编辑文本和一个按钮。另一个只有一个ListView。如果emulator的方向发生任何变化,如何保存列表视图中的数据 我的问题是,当我旋转模拟器的屏幕时,我不知道如何保存和恢复我的ListView。我应该将onSaveInstanceState和onRestoreInstanceState方法放在哪里,以及如何使用它们 MainActivity.java public class MainActivity extends Activity implements

我有两个
片段
。其中一个有一个
编辑文本
和一个
按钮
。另一个只有一个
ListView
。如果emulator的方向发生任何变化,如何保存
列表视图中的数据

我的问题是,当我旋转模拟器的屏幕时,我不知道如何保存和恢复我的
ListView
。我应该将
onSaveInstanceState
onRestoreInstanceState
方法放在哪里,以及如何使用它们

MainActivity.java

    public class MainActivity extends Activity implements AddToDoFragment.OnToDoAddedListener {

private ArrayList<String> todoItems;
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    FragmentManager fm = getFragmentManager();

    ToDoListFragment listToDo = new ToDoListFragment();
    listToDo = (ToDoListFragment) fm.findFragmentById(R.id.list_view_fragment);
    todoItems = new ArrayList<String>();
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, todoItems);
    listToDo.setListAdapter(adapter);
}

public void OnToDoAdded(String newToDo) {
    todoItems.add(newToDo);
    adapter.notifyDataSetChanged();

}
ToDoListFragment.java

public class AddToDoFragment extends Fragment {

public interface OnToDoAddedListener {

    public void OnToDoAdded (String newToDo);

}

private OnToDoAddedListener onToDoAddedListener;

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

    final EditText edittext = (EditText) view.findViewById(R.id.editText);
    final Button button = (Button) view.findViewById(R.id.addButton);
    button.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            // TODO Auto-generated method stub

            String text = edittext.getText().toString();
            onToDoAddedListener.OnToDoAdded(text);
            edittext.setText("");
        }
    });

    return view;

}

 @Override
    public void onAttach(Activity activity) {
      super.onAttach(activity);
      if (activity instanceof OnToDoAddedListener) {
        onToDoAddedListener = (OnToDoAddedListener) activity;
      } else {
        throw new ClassCastException(activity.toString()
            + " must implemenet AddToDoFragment.OnToDoAddedListener");
      }
    }
   }
public class ToDoListFragment extends ListFragment {
}

您需要覆盖活动的
onSaveInstanceState
方法,以便知道何时需要保存状态。然后还需要更新
onCreate
方法,以检查
savedInstanceState
是否为
null
。如果为
null
,则该活动尚未启动。这是
MainActivity
类的示例,您可以从这里开始:

MainActivity.java

public class MainActivity extends Activity implements AddToDoFragment.OnToDoAddedListener {

private ArrayList<String> todoItems;
private ArrayAdapter<String> adapter;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    if(savedInstanceState == null) {
        todoItems = new ArrayList<String>();
    } else {
        todoItems = savedInstanceState.getStringArrayList("todoItemTag");//the tag must match what the variable was saved with
    }

    FragmentManager fm = getFragmentManager();

    ToDoListFragment listToDo = new ToDoListFragment();
    listToDo = (ToDoListFragment) fm.findFragmentById(R.id.list_view_fragment);
    adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, todoItems);
    listToDo.setListAdapter(adapter);
}

public void OnToDoAdded(String newToDo) {
    todoItems.add(newToDo);
    adapter.notifyDataSetChanged();

}

//Saving the instance by overriding this function
@Override
protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    outState.putStringArrayList("todoItemTag", todoItems);//it would be advised to make the tags a static final String
}
公共类MainActivity扩展活动实现AddToDoFragment.OnToDoAddedListener{
私人ArrayList todoItems;
专用阵列适配器;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
如果(savedInstanceState==null){
todoItems=新的ArrayList();
}否则{
todoItems=savedInstanceState.getStringArrayList(“todoItemTag”);//标记必须与保存变量的内容匹配
}
FragmentManager fm=getFragmentManager();
ToDoListFragment listToDo=新的ToDoListFragment();
listToDo=(ToDoListFragment)fm.findFragmentById(R.id.list\u view\u fragment);
adapter=newarrayadapter(这是android.R.layout.simple\u list\u item\u 1,todoItems);
setListTodo.setListAdapter(适配器);
}
已添加公共void(字符串newToDo){
todoItems.add(newToDo);
adapter.notifyDataSetChanged();
}
//通过重写此函数保存实例
@凌驾
SaveInstanceState上受保护的无效(束超出状态){
super.onSaveInstanceState(超出状态);
putStringArrayList(“todoItemTag”,todoItems);//建议将标记设置为静态最终字符串
}
希望这有帮助


PS:我不认为
onrestoreinnstancestate
方法真的有必要。我想我以前从未使用过它。我相信您应该能够在
onCreate
方法中使用
null
检查提供相同的功能。

感谢您的关注,但不幸的是,我在方法中遇到了一个错误ableArrayList(String,ArrayList)同时getParcelableArrayList方法给出了类似以下边界不匹配的错误:Bundle类型的通用方法getParcelableArrayList(String)不适用于参数(String)。推断的类型字符串不是有界参数的有效替代品。请参见我的新编辑。您将希望使用get/set
StringArrayList
而不是
ParcelableArrayList
我应用了您的建议,但它仍然不起作用。当我旋转模拟器屏幕时,以前的listview数据将丢失。是否还有其他建议?ooovvv okı看到了我缺少的东西,我重新创建了我的arraylist,这样每次试用时它都会显示空列表。当我删除那一行时,它工作得非常好。再次非常感谢你。。。