您好我正在尝试使用4个按钮创建弹出窗口,以更改Google地图活动中的地图类型。我已经使用GoogleMap对象在类中设置了单击侦听器,但是在单击其中一个按钮时出现此错误。
Process: com.student.nick.earthquakereport, PID: 7770
java.lang.IllegalStateException: Could not find method setMapNormal(View) in a parent or ancestor Context for android:onClick attribute defined on view class android.widget.Button with id 'mapNormal'
at android.view.View$DeclaredOnClickListener.resolveMethod(View.java:4485)
at android.view.View$DeclaredOnClickListener.onClick(View.java:4449)
at android.view.View.performClick(View.java:5204)
at android.view.View$PerformClick.run(View.java:21156)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5466)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
该对话框在onClick方法所在的同一类中启动。
layFlator = (LayoutInflater) getApplicationContext().getSystemService(LAYOUT_INFLATER_SERVICE);
ViewGroup containter = (ViewGroup) layFlator.inflate(R.layout.map_settings, null);
mapSettings = new PopupWindow(containter, 750, 680, true);
mapSettings.setAnimationStyle(R.style.PopupAnimation);
mapSettings.showAtLocation(layout, Gravity.CENTER, 0,0);
containter.setOnTouchListener(new View.OnTouchListener() {
@Override
public boolean onTouch(View v, MotionEvent event) {
mapSettings.dismiss();
return false;
}
});
方法
public void setMapNormal(View view) {
mMap.setMapType(GoogleMap.MAP_TYPE_NORMAL);
mapSettings.dismiss();
}
public void setMapHybrid(View view) {
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mapSettings.dismiss();
}
public void setMapTerrain(View view) {
mMap.setMapType(GoogleMap.MAP_TYPE_TERRAIN);
mapSettings.dismiss();
}
public void setMapSat(View view) {
mMap.setMapType(GoogleMap.MAP_TYPE_SATELLITE);
mapSettings.dismiss();
}
谢谢你看看
编辑:弹出窗口打开的布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent"
android:fadingEdge="horizontal|vertical"
android:fadingEdgeLength="4dp"
android:elevation="20dp"
android:background="@drawable/popwindow_border"
>
<Button
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="Normal"
android:id="@+id/mapNormal"
android:layout_gravity="center_horizontal"
android:onClick="setMapNormal"/>
<Button
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="Hybrid"
android:id="@+id/mapHybrid"
android:layout_gravity="center_horizontal"
android:onClick="setMapHybrid"/>
<Button
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="Terrain"
android:id="@+id/mapTerrain"
android:layout_gravity="center_horizontal"
android:onClick="setMapTerrain"/>
<Button
android:layout_width="180dp"
android:layout_height="wrap_content"
android:text="Satellite"
android:id="@+id/button2"
android:layout_gravity="center_horizontal"
android:onClick="setMapSat"/>
</LinearLayout>
答案 0 :(得分:0)
您的错误消息明确说:
java.lang.IllegalStateException:找不到方法 用于android:onClick的父或祖先上下文中的setMapNormal(View) 在视图类android.widget.Button上使用id定义的属性 &#39; mapNormal&#39;
因此,您没有在onClickListener中正确访问该方法。您无法使用
调用该方法this.methodName()
在处理程序内部。您可能想要使用类似
的内容ClassName.this.methodName()
或
getActivity().methodName()
答案 1 :(得分:0)
您没有正确设置onClickListener。看看android:onClick。
例如,如果指定android:onClick =&#34; sayHello&#34;,则必须声明上下文的公共void sayHello(View v)方法(通常是您的Activity)。
答案 2 :(得分:0)
所以我环顾四周找到了一个教程,这是正确的方法。
layFlator = (LayoutInflater) getBaseContext().getSystemService(LAYOUT_INFLATER_SERVICE);
View popUp = layFlator.inflate(R.layout.map_settings, null);
popupWindow = new PopupWindow(popUp, 750, 680, true);
popupWindow.setAnimationStyle(R.style.PopupAnimation);
Button btnHybrid = (Button) popUp.findViewById(R.id.mapHybrid);
btnHybrid.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
Log.d("hybrid", "called");
popupWindow.dismiss();
}
});