0

MapFragmentをコミットし、でそのマップへの参照を取得した後にマップ タイプを設定しようとすると、Null Pointer Exception が発生しgetMap()ます。

エラーの原因は、フラグメントがまだ初期化されていないため、マップ タイプを設定できないためだと思います。

このフラグメントがいつ初期化され、パブリック メソッドを呼び出すことが許可されているかを知るにはどうすればよいですか? MainActivityフラグメントがいつロードされたかを知るために実装できるインターフェースはありますか?

さらに、まだ初期化されていないのに、なぜ呼び出しが許可されてgetMap()いるのですか? mMapFragment実際にGoogleMap正しく初期化されていないのはオブジェクトだけですか?

これが私のコードです:

public class MainActivity extends Activity {

    private static final String LOG_TAG = MainActivity.class.getSimpleName();
    private FragmentManager fm;
    private MapFragment mMapFragment;
    private GoogleMap mGoogleMap;

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

        fm = getFragmentManager();
        mMapFragment = MapFragment.newInstance();

        fm.beginTransaction().add(R.id.fragment_container, mMapFragment).commit();
        mGoogleMap = mMapFragment.getMap();

        mGoogleMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
    }
}

および の XML main_container:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/fragment_container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

</FrameLayout>

LogCat の出力は次のとおりです。

10-09 11:17:16.457: E/AndroidRuntime(31679): FATAL EXCEPTION: main
10-09 11:17:16.457: E/AndroidRuntime(31679): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.matthewlogan.loopfinder/com.matthewlogan.loopfinder.MainActivity}: java.lang.NullPointerException
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2248)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2298)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.ActivityThread.access$600(ActivityThread.java:142)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1285)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.os.Handler.dispatchMessage(Handler.java:99)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.os.Looper.loop(Looper.java:137)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.ActivityThread.main(ActivityThread.java:5270)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at java.lang.reflect.Method.invokeNative(Native Method)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at java.lang.reflect.Method.invoke(Method.java:525)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:974)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:790)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at dalvik.system.NativeStart.main(Native Method)
10-09 11:17:16.457: E/AndroidRuntime(31679): Caused by: java.lang.NullPointerException
10-09 11:17:16.457: E/AndroidRuntime(31679):    at com.matthewlogan.loopfinder.MainActivity.onCreate(MainActivity.java:36)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.Activity.performCreate(Activity.java:5133)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1098)
10-09 11:17:16.457: E/AndroidRuntime(31679):    at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2212)
10-09 11:17:16.457: E/AndroidRuntime(31679):    ... 11 more
4

2 に答える 2

3

MapFragmentコードで作成された は、次のGoogleMap場合に準備完了です。

  1. それonCreateViewが戻ってきた
  2. Google Play 開発者サービス アプリがインストールされ、正しいバージョンがインストールされている

で null 以外を取得する場合は、次のようにしGoogleMapます。ActivityonResume

if (mGoogleMap == null) {
    mGoogleMap = mMapFragment.getMap();
    if (mGoogleMap != null) {
        initMap();
    }
}

Double ifs ensureはインスタンスinitMapごとに 1 回だけ呼び出され、準備ができたときにのみ呼び出されます。ユーザーが Google Play Services をインストールしてアプリに戻った (2 回目の呼び出し) 後に準備ができるため、これは正しい処理方法です。ActivityGoogleMapGoogleMaponResume

于 2013-10-09T20:31:01.340 に答える
1

このフラグメントがいつ初期化され、パブリック メソッドを呼び出すことが許可されているかを知るにはどうすればよいですか?

などのライフサイクル メソッドのいずれかでマップ フラグメントを構成しますonActivityCreated()

または、 を使用する代わりに、レイアウトで タグをFragmentTransaction使用します。<fragment>

于 2013-10-09T18:35:30.923 に答える