2017-05-23 13 views
1

MapViewを内部に持つマップフラグメントがあります。 私はonMapReadyメソッドでGoogleマップオブジェクトを初期化し、最初にこのメソッドで設定したマーカーを正常に動作させます。しかし、マーカーを変更したり別のカスタムメソッドで新しいマーカーを設定したりするとすぐに、私のgoogleMapオブジェクトがnullであるというNullPointerExceptionが発生します。それはすでに初期化されているからではありません。Android:Googeマップは初期化されていますがnullです

ご協力いただき誠にありがとうございます。事前にどうもありがとうございました。ここで

は私のコードです:

これは、フラグメント活動ofmy初めは次のようになります。これはonMapReady方法である

public class MapsFragment extends Fragment implements OnMapReadyCallback { 

MapView mMapView; 
private GoogleMap googleMap; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    View rootView = inflater.inflate(R.layout.fragment_maps, container, false); 

    mMapView = (MapView) rootView.findViewById(R.id.mapView); 
    mMapView.onCreate(savedInstanceState); 

    mMapView.onResume(); // needed to get the map to display immediately 

    try { 
     MapsInitializer.initialize(getActivity().getApplicationContext()); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    mMapView.getMapAsync(this); 

    return rootView; 
} 

@Override 
public void onMapReady(GoogleMap gMap) { 
    // The global variable googleMap gets initialised 
    googleMap = gMap; 
    LatLng sydney = new LatLng(-33.852, 151.211); 
    googleMap.addMarker(new MarkerOptions().position(sydney).title("Marker in Sydney")); 
    googleMap.moveCamera(CameraUpdateFactory.newLatLng(sydney)); 
} 

これは、メソッドと呼ばれる私のカスタムユーザーであります:

public void updateCamera(String search_string) { 

    LatLng search_string_place = new LatLng(-37.9712371, 144.4927088); 

    // THIS is where the NullPointer exception happens for the first time 
    googleMap.addMarker(new 
    MarkerOptions().position(search_string_place).title(Melbourne)); 

    googleMap.moveCamera(CameraUpdateFactory.newLatLng(search_string_place)); 
} 

すべてのメソッドは、同じクラスにあります。MapsFragment

編集:

エラーログ:

FATAL EXCEPTION: main 
Process: <packagename>, PID: 26556 
java.lang.IllegalStateException: Could not execute method of the activity 
    at android.view.View$1.onClick(View.java:3830) 
    at android.view.View.performClick(View.java:4445) 
    at android.view.View$PerformClick.run(View.java:18446) 
    at android.os.Handler.handleCallback(Handler.java:733) 
    at android.os.Handler.dispatchMessage(Handler.java:95) 
    at android.os.Looper.loop(Looper.java:136) 
    at android.app.ActivityThread.main(ActivityThread.java:5146) 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:732) 
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:566) 
    at dalvik.system.NativeStart.main(Native Method) 
Caused by: java.lang.reflect.InvocationTargetException 
    at java.lang.reflect.Method.invokeNative(Native Method) 
    at java.lang.reflect.Method.invoke(Method.java:515) 
    at android.view.View$1.onClick(View.java:3825) 
    ... 11 more 
Caused by: java.lang.NullPointerException 
    at <packagename>.MapsFragment.updateCamera(MapsFragment.java:134) 
    at <packagename>.MainActivity.callUpdateCamera(MainActivity.java:46) 
    ... 14 more 

私のマニフェストファイル:

<?xml version="1.0" encoding="utf-8"?> 

<!-- 
    The ACCESS_COARSE/FINE_LOCATION permissions are not required to use 
    Google Maps Android API v2, but you must specify either coarse or fine 
    location permissions for the 'MyLocation' functionality. 
--> 
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> 
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" /> 
<uses-permission android:name="android.permission.INTERNET" /> 

<application 
    android:allowBackup="true" 
    android:icon="@mipmap/ic_launcher" 
    android:label="@string/app_name" 
    android:supportsRtl="true" 
    android:theme="@style/AppTheme" 
    android:name="android.support.multidex.MultiDexApplication"> 
    <activity android:name=".MainActivity"> 
     <intent-filter> 
      <action android:name="android.intent.action.MAIN" /> 

      <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 
    </activity> 
    <!-- 
     The API key for Google Maps-based APIs is defined as a string resource. 
     (See the file "res/values/google_maps_api.xml"). 
     Note that the API key is linked to the encryption key used to sign the APK. 
     You need a different API key for each encryption key, including the release key that is used to 
     sign the APK for publishing. 
     You can define the keys for the debug and release targets in src/debug/ and src/release/. 
    --> 
    <meta-data 
     android:name="com.google.android.geo.API_KEY" 
     android:value="@string/google_maps_key" /> 

</application> 

EDIT:

私はただ一つのクラス/活動のすべてを置くことによって、問題を解決しました。その後、すべての呼び出しがうまくいった。問題は、MapsFragmentの新しいインスタンスを作成し、この新しいインスタンスでグローバルvar googleMapが定義されていなかったことだと思います。

ありがとうございました。

+0

Postにエラー –

+1

のログをGoogleマップのオブジェクトを変更したときに、それが働いていた、同じ問題を抱えていましたか?そうであれば、はい、マップはnullです –

+0

いいえ、そうではありません。メソッドはボタンを押すことによって呼び出され、最初のマーカーが表示された後にボタンを押します。 – s137

答えて

0

カスタムメソッドをどこで呼び出すのかわかりませんが、初期化したマップをメソッドに渡してアクセスできるようにすることができます。

これを試してみてください:

public void updateCamera(String search_string, GoogleMap googleMap) { 

    LatLng search_string_place = new LatLng(-37.9712371, 144.4927088); 

    // THIS is where the NullPointer exception happens for the first time 
    googleMap.addMarker(new 
    MarkerOptions().position(search_string_place).title(Melbourne)); 

    googleMap.moveCamera(CameraUpdateFactory.newLatLng(search_string_place)); 
} 
+0

これは良い考えですが、実際には選択肢ではありません。別のアクティビティのメソッドをマップに直接アクセスできない場所から呼び出すためです。私が呼び出すメソッドだけがアクセス権を持っています。 – s137

+0

は、私はこのようなMapsFragmentクラスのインスタンスを作成することによって、私の主な活動の中からメソッドを呼び出します。 'パブリッククラスMainActivityがFragmentActivityを拡張{ MapsFragment MF =新しいMapsFragment();' 右MainActivityの先頭にその後、ボタンを押したときに 'mf.callUpdateCamera(..) 'を呼び出します これはエラーの原因になりますか? – s137

+0

完全なコードを投稿してください –

1

は、私はあなたが `onMapReady`その前にupdateメソッドを呼び出している静的

関連する問題