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/setStringArrayList
而不是ParcelableArrayList
我应用了您的建议,但它仍然不起作用。当我旋转模拟器屏幕时,以前的listview数据将丢失。是否还有其他建议?ooovvv okı看到了我缺少的东西,我重新创建了我的arraylist,这样每次试用时它都会显示空列表。当我删除那一行时,它工作得非常好。再次非常感谢你。。。