Java Android Studio:点击按钮弹出窗口布局

Java Android Studio:点击按钮弹出窗口布局,java,android,android-studio,Java,Android,Android Studio,您好,我正在尝试创建一个带有4个按钮的弹出窗口,用于更改谷歌地图活动中的地图类型。我已经在带有GoogleMap对象的类中设置了on click侦听器,但是在单击其中一个按钮时出现了此错误 Process: com.student.nick.earthquakereport, PID: 7770 java.lang.IllegalStateException: Could not find method setMapNormal(View) in a parent or a

您好,我正在尝试创建一个带有4个按钮的弹出窗口,用于更改谷歌地图活动中的地图类型。我已经在带有GoogleMap对象的类中设置了on click侦听器,但是在单击其中一个按钮时出现了此错误

 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>


.

您的错误消息清楚地表明:

java.lang.IllegalStateException:找不到方法 android的父或祖先上下文中的setMapNormal(视图):onClick 在id为的视图类android.widget.Button上定义的属性 “地图法线”

因此,您没有在onClickListener中正确访问该方法。您不能仅仅使用

this.methodName()
在处理器内部。您可能需要使用类似

ClassName.this.methodName()


您没有正确地设置ClickListener。看一看

例如,如果指定android:onClick=“sayHello”,则必须声明上下文(通常是活动)的公共void sayHello(视图v)方法


所以我环顾四周,找到了一个教程,这是正确的方法

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();
        }
    });

我的点击监听器是在XML中设置的,所以我不能这样做。我猜弹出窗口是一个activity.XML,我可以给它附加一个类并传递额外的吗?我不确定你是否可以这样添加一个onClickListener。至少我从来没有碰巧这么做过。尝试从那里删除它并将其放入Java代码中,然后检查or是否有效。当您看到onClickListener时,它为null。首先使用findViewById获取按钮,代码如中所示,似乎“mapHybrid按钮”在用于popupwindow的contentView的xml中,而不是活动中。在活动中使用
findViewbyId
方法之前,应调用
setContentView(View-View)
方法,否则
findViewbyId
将返回null。如下:
setContentView(R.layout.xxx);Button Button=(Button)findViewById(R.id.yyy)
按钮yyy在xxx.xml中,我已经完成了,它在活动的java类中,弹出窗口是覆盖的,而不是在标题中放置已解决的问题,您可以接受自己的答案。
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();
        }
    });