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が定義されていなかったことだと思います。
ありがとうございました。
Postにエラー –
のログをGoogleマップのオブジェクトを変更したときに、それが働いていた、同じ問題を抱えていましたか?そうであれば、はい、マップはnullです –
いいえ、そうではありません。メソッドはボタンを押すことによって呼び出され、最初のマーカーが表示された後にボタンを押します。 – s137