私はアンドロイド用の簡単なアプリケーションを書いていますが、本当に初心者です。
私がやろうとしているHashMap<String, ArrayList<CustomObject>>
のは、カスタムオブジェクトを作成してそれらをに保存することです.それは機能していますが、ランドスケープモードにすると、それ以降に保存したものはすべて明らかに「忘れられます」. これを解決するために、メイン アクティビティのメソッドをオーバーライドしようとしていますonSavedInstanceState()
(タブ レイアウトを設定するために 3 つのフラグメントを作成します)。
これは私の実装です:
@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
myCustomObjectManager.saveInstanceState(savedInstanceState);
super.onSaveInstanceState(savedInstanceState);
}
myCustomObjectManager は、次のように saveInstanceState を実装します。
public void saveInstanceState(Bundle savedInstanceState) {
ArrayList<String> keySet = new ArrayList<String>(myHashmap.keySet());
//store the keySet
savedInstanceState.putStringArrayList(SAVED_KEYSET, keySet);
//retrieve arrayLists and store them
for (String i : keySet){
ArrayList<CustomObject> currentList = myHashmap.get(i);
savedInstanceState.putParcelableArrayList(i, currentList);
}
}
これらのデータを次のように回復します。
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
//check whether we're recreating a previously destroyed instance
if (savedInstanceState != null){
//restore saved values
myCustomObjectManager.loadInstanceState(savedInstanceState);
}
public void loadInstanceState(Bundle savedInstanceState) {
//retrieve stored keySet
ArrayList<String> keySet = savedInstanceState.getStringArrayList(SAVED_KEYSET);
//retrieve stored lists and load them on my map
for (String i : keySet){
ArrayList<CustomObject> currentList = savedInstanceState.getParcelableArrayList(i);
myHashMap.put(i, currentList);
}
}
横向きに行って縦向きモードに戻っても、まだ CustomObjects が に表示されているため、機能しているListView
ようです。問題は、縦向きモードに戻った後、何も機能していないことです。つまり、ボタンをクリックするとクラッシュするなど..
Log Cat は、「IllegalStateException: アクティビティのメソッドを実行できませんでした」と言う 「MainActivity.onAddClicked での NullPointerException」が原因
これは、次をスローしている行ですNullPointerException
。
EditText title = (EditText) fragment.getView().findViewById(R.id.new_title);
このコードに挿入される
//get current fragment
int index = myViewPager.getCurrentItem();
Fragment fragment = myTabsPagerAdapter.getFragment(index);
EditText title = (EditText) fragment.getView().findViewById(R.id.new_title);
だから私は、私がすべきことすべてを「保存」しているのではなく、ユーザーが挿入したデータ以外のものをバンドルに入れるべきだと本当に思っていますか?