java.lang.IllegalStateException(无法执行android的方法:onClick访问变量Android [重复])

博观而约取,厚积而薄发。这篇文章主要讲述java.lang.IllegalStateException:无法执行android的方法:onClick访问变量Android [重复]相关的知识,希望能为你提供帮助。
这个问题在这里已有答案:

  • What is a NullPointerException, and how do I fix it? 12个答案
【java.lang.IllegalStateException(无法执行android的方法:onClick访问变量Android [重复])】我正在使用app并且有按钮,当我点击它时,它将显示所选标记的纬度和经度(当前位置和选择的标记)我在此类中创建自定义信息窗口适配器有所选标记的纬度和经度所以在CustomInfoWindowAdapter.java我已经为(纬度和经度)创建了GET方法,并且在MainActivityMaps.java我创建了按钮的方法,在我创建的这个方法中(显示当前和标记选择的两种方法)当前工作正常,但我有问题(错误)在(选择标记)应用程序崩溃
main activity.Java
// button onclick callto show latitude andlongitude as a toast for test publicvoid showcurrentlocationattost(View view){ displaytestcurrent(mLastLocation); displayplace(mCurrLocationMarker); // mCurrLocationMarker -> just name }public void displaytestcurrent(Location location){ LatLng latLngcurrent = new LatLng(location.getLatitude(), location.getLongitude()); String text = (String.valueOf("latitude = "+latLngcurrent.latitude+" , "+"longitude = "+ latLngcurrent.longitude)); Toast.makeText(getApplicationContext(), text, Toast.LENGTH_SHORT).show(); }public void displayplace(Marker marker){ Context context = getApplicationContext(); CustomInfoWindowAdapter op = new CustomInfoWindowAdapter(context); // access getlati for latitude and getlongi //for longitudeFrom this class//CutomInfoWindowAdapter.java String text = (String.valueOf("latitude = "+op.getlati()+" , "+"longitude = "+ op.getlongi())); Toast.makeText(getApplicationContext(), text,Toast.LENGTH_SHORT).show(); // for test Log.d("testL", String.valueOf(op.getlati())); }

Cu Tom info window adapter.Java
package com.example.mostafa.parking; import android.content.Context; import android.util.Log; import android.view.LayoutInflater; import android.view.View; import android.widget.TextView; import android.widget.Toast; import com.google.android.gms.maps.GoogleMap; import com.google.android.gms.maps.model.LatLng; import com.google.android.gms.maps.model.Marker; public class CustomInfoWindowAdapter implements GoogleMap.InfoWindowAdapter{private Marker marker; private final View mWindow; private Context mContext; double lati=0.0; double longi=0.0 ; String locat; public CustomInfoWindowAdapter(Context context){ mContext = context; mWindow = LayoutInflater.from(context).inflate(R.layout.custom_info_window,null); }private double rendomWindowtext(Marker marker, View view){ LatLng location = marker.getPosition(); String title = marker.getTitle(); TextView tvTitle = (TextView) view.findViewById(R.id.title); TextView tvLocat = (TextView) view.findViewById(R.id.locat); lati = location.latitude; longi = location.longitude; if (!title.equals("")){ tvTitle.setText(title); } if (!location.equals("")){ tvLocat.setText(String.valueOf(lati)); }Log.d("lati", String.valueOf(lati)); Log.d("longi", String.valueOf(longi)); locat= String.valueOf(location); Log.d("Location", String.valueOf(location.latitude)); String text = (String.valueOf("latitude = "+lati+" , "+"longitude = "+ longi)); Toast.makeText(mContext.getApplicationContext(), text, Toast.LENGTH_SHORT).show(); return lati; }publicdouble getlati(){ LatLng location = marker.getPosition(); return location.latitude; }publicdouble getlongi(){ LatLng location = marker.getPosition(); return location.longitude; }@Override public View getInfoWindow(Marker marker) { rendomWindowtext(marker,mWindow); return mWindow; }@Override public View getInfoContents(Marker marker) { rendomWindowtext(marker,mWindow); return mWindow; } }

XML
< ?xml version="1.0" encoding="utf-8"?> < RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> < fragment xmlns:android="http://schemas.android.com/apk/res/android" xmlns:map="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/map" android:name="com.google.android.gms.maps.SupportMapFragment" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivityMaps" /> < --onClick="showcurrentlocationattost --> < Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Direction" android:onClick="showcurrentlocationattost"/> < /RelativeLayout>

错误
Process: com.example.mostafa.parking, PID: 5750 java.lang.IllegalStateException: Could not execute method for android:onClick at android.view.View$DeclaredOnClickListener.onClick(View.java:4700) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22288) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Caused by: java.lang.reflect.InvocationTargetException at java.lang.reflect.Method.invoke(Native Method) at android.view.View$DeclaredOnClickListener.onClick(View.java:4695) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22288) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757) Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'com.google.android.gms.maps.model.LatLng com.google.android.gms.maps.model.Marker.getPosition()' on a null object reference at com.example.mostafa.parking.CustomInfoWindowAdapter.getlati(CustomInfoWindowAdapter.java:62) at com.example.mostafa.parking.MainActivityMaps.displayplace(MainActivityMaps.java:334) at com.example.mostafa.parking.MainActivityMaps.showcurrentlocationattost(MainActivityMaps.java:306) at java.lang.reflect.Method.invoke(Native Method) at android.view.View$DeclaredOnClickListener.onClick(View.java:4695) at android.view.View.performClick(View.java:5612) at android.view.View$PerformClick.run(View.java:22288) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6123) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:757)

答案除非我遗漏了某些东西,否则标记始终为空。
publicdouble getlati(){ LatLng location = marker.getPosition(); return location.latitude; }publicdouble getlongi(){ LatLng location = marker.getPosition(); return location.longitude; }

也许我错过了一些东西,但我看不到在适配器中设置标记的位置。你将它声明在顶部,但它从未设置过。因此总是空的。
另一答案问题是CustomInfoWindowAdapter中的标记对象是NULL,这就是抛出NullPointerException的原因。
解决它的一种方法是在该类的构造函数中添加标记,我的意思是替换它:
public CustomInfoWindowAdapter(Context context){ mContext = context; mWindow = LayoutInflater.from(context).inflate(R.layout.custom_info_window,null); }

有了这个:
public CustomInfoWindowAdapter(Context context, Marker marker){ mContext = context; mWindow = LayoutInflater.from(context).inflate(R.layout.custom_info_window,null); this.marker = marker; }

并在displayplace中创建实例时传递标记,如下所示:
CustomInfoWindowAdapter op = new CustomInfoWindowAdapter(context, marker);


    推荐阅读