Tab付きFragmentで元のFragmentに戻るとエラー
お世話になります
Androidで地図の入ったFragmentのアプリを作っているのですが、ちょっとハマってしまったので
質問させてください。
初期画面側が地図なのですが、一度別のタブに移動→また地図側に戻ると、以下のエラーを吐いて止まってしまいます。
03-02 08:26:08.519 4221-4221/shiratsu.co.jp.cafesagashi E/AndroidRuntime﹕ FATAL EXCEPTION: main
java.lang.NullPointerException
at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:708)
at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489)
at android.support.v4.app.FragmentManagerImpl$1.run(FragmentManager.java:454)
at android.os.Handler.handleCallback(Handler.java:725)
at android.os.Handler.dispatchMessage(Handler.java:92)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:5041)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
at dalvik.system.NativeStart.main(Native Method)
いろいろ調べてはいるもののちょっと原因がつかめておらずでして。。。
public class CafeMapFragment extends Fragment {
//private OnFragmentInteractionListener mListener;
private SupportMapFragment fragment;
/*object of google map*/
public GoogleMap mGoogleMap;
/**
* Use this factory method to create a new instance of
* this fragment using the provided parameters.
*
* @return A new instance of fragment CafeMapFragment.
*/
// TODO: Rename and change types and number of parameters
public static CafeMapFragment newInstance() {
CafeMapFragment fragment = new CafeMapFragment();
Bundle args = new Bundle();
fragment.setArguments(args);
return fragment;
}
public CafeMapFragment() {
// Required empty public constructor
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public void onResume() {
super.onResume();
setUpMapIfNeeded();
}
private void setUpMapIfNeeded() {
if (mGoogleMap == null) {
mGoogleMap = fragment.getMap();
setUpMap();
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
return inflater.inflate(R.layout.fragment_cafe_map, container, false);
}
@Override
public void onActivityCreated(Bundle savedInstanceState) {
// TODO Auto-generated method stub
super.onActivityCreated(savedInstanceState);
FragmentManager fm = getChildFragmentManager();
fragment = (SupportMapFragment) fm.findFragmentById(R.id.fragmentMap);
if (fragment == null) {
fragment = SupportMapFragment.newInstance();
fm.beginTransaction().replace(R.id.fragmentMap, fragment).commit();
}
}
// とりあえず適当にピンたててみたり。
private void setUpMap() {
// 現在位置表示の有効化
mGoogleMap.setMyLocationEnabled(true);
// 設定の取得
UiSettings settings = mGoogleMap.getUiSettings();
// コンパスの有効化
settings.setCompassEnabled(true);
// 現在位置に移動するボタンの有効化
settings.setMyLocationButtonEnabled(true);
// ズームイン・アウトボタンの有効化
settings.setZoomControlsEnabled(true);
// 回転ジェスチャーの有効化
settings.setRotateGesturesEnabled(false);
// スクロールジェスチャーの有効化
settings.setScrollGesturesEnabled(true);
// Tlitジェスチャー(立体表示)の有効化
settings.setTiltGesturesEnabled(false);
// ズームジェスチャー(ピンチイン・アウト)の有効化
settings.setZoomGesturesEnabled(true);
mGoogleMap.setOnCameraChangeListener(new GoogleMap.OnCameraChangeListener() {
@Override
public void onCameraChange(CameraPosition position) {
Log.d("TEST", "zoop:" + position.zoom);
}
});
}
public void onDestroyView() {
super.onDestroyView();
try{
FragmentTransaction ft = getActivity().getSupportFragmentManager().beginTransaction();
ft.remove(fragment);
ft.commit();
}catch(Exception e){
}
}
}
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/fragmentMap"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.SupportMapFragment">
</FrameLayout>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="shiratsu.co.jp.cafesagashi.LicenceFragment">
<!-- TODO: Update blank fragment layout -->
<TextView android:layout_width="match_parent" android:layout_height="match_parent"
android:text="@string/hello_blank_fragment" />
</FrameLayout>
public class MainActivity extends FragmentActivity implements FragmentTabHost.OnTabChangeListener {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// FragmentTabHost を取得する
FragmentTabHost tabHost = (FragmentTabHost)findViewById(android.R.id.tabhost);
tabHost.setup(this, getSupportFragmentManager(), R.id.container);
TabHost.TabSpec tabSpec1, tabSpec2;
// TabSpec を生成する
tabSpec1 = tabHost.newTabSpec("tab1");
tabSpec1.setIndicator("tab1");
// TabHost に追加
tabHost.addTab(tabSpec1, CafeMapFragment.class, null);
// TabSpec を生成する
tabSpec2 = tabHost.newTabSpec("tab2");
tabSpec2.setIndicator("tab2");
// TabHost に追加
tabHost.addTab(tabSpec2, LicenceFragment.class, null);
// リスナー登録
tabHost.setOnTabChangedListener(this);
}
@Override
public void onTabChanged(String tabId) {
Log.d("onTabChanged", "tabId: " + tabId);
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the menu; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.menu_main, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
// Handle action bar item clicks here. The action bar will
// automatically handle clicks on the Home/Up button, so long
// as you specify a parent activity in AndroidManifest.xml.
int id = item.getItemId();
//noinspection SimplifiableIfStatement
if (id == R.id.action_settings) {
return true;
}
return super.onOptionsItemSelected(item);
}
}
よろしくお願いいたします