java - 当我尝试使用 ImageButton 获取当前位置时收到错误消息
问题描述
我创建了一个 Google Maps 项目,当我尝试运行应用程序时,在 Logcat 中出现此错误:
2021-05-04 23:04:43.119 30960-30960/com.example.googlemaps E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.googlemaps, PID: 30960
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.googlemaps/com.example.googlemaps.MainActivity}: java.lang.ClassCastException: android.widget.ImageView cannot be cast to android.widget.ImageButton
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3792)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139)
Caused by: java.lang.ClassCastException: android.widget.ImageView cannot be cast to android.widget.ImageButton
at com.example.googlemaps.MainActivity.onCreate(MainActivity.java:55)
at android.app.Activity.performCreate(Activity.java:8198)
at android.app.Activity.performCreate(Activity.java:8182)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1309)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3765)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3968)
at android.app.servertransaction.LaunchActivityItem.execute(LaunchActivityItem.java:85)
at android.app.servertransaction.TransactionExecutor.executeCallbacks(TransactionExecutor.java:135)
at android.app.servertransaction.TransactionExecutor.execute(TransactionExecutor.java:95)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2307)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:246)
at android.app.ActivityThread.main(ActivityThread.java:8506)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:602)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1139)
这是我在 xml 文件中的 ImageButton。
<ImageButton
android:id="@+id/gpsBtn"
android:layout_width="55dp"
android:layout_height="53dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.224"
app:srcCompat="@mipmap/gps" />
这就是我在 MainActivity.java 中使用它的方式。
gpsImageBtn = (ImageButton) findViewById(R.id.gpsBtn);
@Override
public void onMapReady(GoogleMap googleMap) {
map = googleMap;
gpsImageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (ActivityCompat.checkSelfPermission(MainActivity.this, Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED) {
getCurrentLocation();
} else {
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.ACCESS_FINE_LOCATION}, 44);
}
}
});
}
private void getCurrentLocation() {
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
// here to request the missing permissions, and then overriding
// public void onRequestPermissionsResult(int requestCode, String[] permissions,
// int[] grantResults)
// to handle the case where the user grants the permission. See the documentation
// for ActivityCompat#requestPermissions for more details.
return;
}
Task<Location> task = client.getLastLocation();
task.addOnSuccessListener(new OnSuccessListener<Location>() {
@Override
public void onSuccess(Location location) {
if (location != null) {
supportMapFragment.getMapAsync(new OnMapReadyCallback() {
@Override
public void onMapReady(@NonNull GoogleMap googleMap) {
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
MarkerOptions options = new MarkerOptions().position(latLng).title("We are here");
googleMap.animateCamera(CameraUpdateFactory.newLatLngZoom(latLng, 10));
googleMap.addMarker(options);
}
});
}
}
});
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == 44) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
getCurrentLocation();
}
}
}
我希望我的 ImageButton 能够在 Google 地图上获取我的当前位置。
2021-05-05 09:14:18.437 28109-28109/com.example.googlemaps E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.googlemaps, PID: 28109
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ImageView.setOnClickListener(android.view.View$OnClickListener)' on a null object reference
at com.example.googlemaps.MainActivity.onMapReady(MainActivity.java:128)
at com.example.googlemaps.-$$Lambda$LoyQsFFqrj9dAHwAkAA_9-9Ps-k.onMapReady(Unknown Source:2)
at com.google.android.gms.maps.zzat.zzb(com.google.android.gms:play-services-maps@@17.0.1:1)
at com.google.android.gms.maps.internal.zzaq.zza(com.google.android.gms:play-services-maps@@17.0.1:6)
at com.google.android.gms.internal.maps.zzb.onTransact(com.google.android.gms:play-services-maps@@17.0.1:3)
at android.os.Binder.transact(Binder.java:1043)
at cx.b(:com.google.android.gms.dynamite_mapsdynamite@201817052@20.18.17 (040700-0):2)
at com.google.maps.api.android.lib6.impl.be.run(:com.google.android.gms.dynamite_mapsdynamite@201817052@20.18.17 (040700-0):2)
at android.os.Handler.handleCallback(Handler.java:938)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:223)
at android.app.ActivityThread.main(ActivityThread.java:7656)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)
我想尝试让自己成为某种实际 Google 地图的副本。
解决方案
推荐阅读
- flutter - 我无法生成用于分发的 apk 文件
- .net - .NET WebAPI:自定义授权标头
- google-apps-script - Google Docs - 自动更新 Google 表格中的链接对象
- r - 如何使用 dplyr 旋转复杂的整洁数据框
- nuget - 带有安全更新选项的 nuget 更新的 dotnet cli 等效命令
- azure - 是否有更新代理池元数据的范围?
- python - python在for循环中的特殊情况下递减
- node.js - UnhandledPromiseRejectionWarning:错误 [ERR_HTTP_HEADERS_SENT]:在将标头发送到 ServerResponse.setHeader 的客户端后无法设置标头
- apache - 记录 htaccess 拒绝的 url
- python - 没有这样的元素例外硒