Fragment に向きの変更時にインスタンスを保持させることができません。
活動クラス
public class MyActivity extends Activity
{
private MyFragment fragment;
public void onCreate(Bundle savedInstanceState)
{
if(savedInstanceState == null)
{
fragment = new MyFragment();
}
//null pointer exception on this line of code. fragment not being retained.
getFragmentManager().beginTransaction().replace(R.id.fragment_container, fragment).commit();
}
}
フラグメント クラス
public class MyFragment extends Fragment
{
private View view;
private CustomListViewAdapter adapter;
public ArrayList<HashMap<String, String>> arrHashMap;
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState)
{
view = inflater.inflate(R.layout.fragment_screen, container, false);
if(arrHashMap != null)
{
ListView lv = (ListView) view.findViewById(R.id.fragment_lv);
adapter = new CustomListViewAdapter( (MyActivity)getActivity() , arrHashMap);
lv.setAdapter(adapter);
lv.setOnItemClickListener((MyActivity)getActivity());
}
else
{
/* some code to create arrHashMap variable
*/
ListView lv = (ListView) view.findViewById(R.id.fragment_lv);
adapter = new CustomListViewAdapter( (MyActivity)getActivity() , arrHashMap);
lv.setAdapter(adapter);
lv.setOnItemClickListener((MyActivity)getActivity());
}
return(view);
}
public void onActivityCreated(Bundle savedInstanceState)
{
super.onActivityCreated(savedInstanceState);
setRetainInstance(true);
}
}
onActivityCreated で setRetainInstance(true) が設定されているにもかかわらず、方向の変更時に MyFragment が null のままです。MyActivity が作成されると、MyFragment も常に再作成されます。また、setRetainInstance(true) が UI フラグメントに使用されないことを理解していますが、保存されたアダプターまたはビュー メンバー変数を使用していません。向きの変更時に保持された arrHashMap 変数のみを再利用しているので、アダプターを再作成できます。そしてUIを変更。