Search code examples
javaandroidruntime-errorpopupwindowillegalstateexception

PopUp window shows IllegalStateException


I'm new to android. I wanna print a message(using Log.i) when the button is pressed in popup window but it exit & shows

java.lang.IllegalStateException: Could not find method deletemtd(View) in a parent or ancestor Context for android:onClick attribute defined on view class com.google.android.material.button.MaterialButton with id 'button'

My onclick method coding

    public void onButtonShowPopupWindowClick(View view) {

    // inflate the layout of the popup window
    LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
    View popupView = inflater.inflate(R.layout.activity_output_calculation, null);

    // create the popup window
    int width = LinearLayout.LayoutParams.MATCH_PARENT;
    int height = LinearLayout.LayoutParams.WRAP_CONTENT;
    boolean focusable = true; // lets taps outside the popup also dismiss it
    final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);

    // show the popup window
    // which view you pass in doesn't matter, it is only used for the window tolken
    popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);

    // dismiss the popup window when touched
    popupView.setOnTouchListener(new View.OnTouchListener() {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            popupWindow.dismiss();
            return true;
        }
    });

}

popup layout's activity_output_calculation.xml code

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@color/myRED"
    android:orientation="vertical"
    tools:context=".Output_calculation">

    <Button
        android:id="@+id/button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:onClick="deletemtd"
        android:text="Button" />

</LinearLayout>

Java code of popup

public class Output_calculation extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_output_calculation);
    }

    public void deletemtd(View view) {
        Log.i("tag nema", "deletemtd:");
    }
}

I wanna print this log message in run console when the button is pressed.


Solution

  • The layout you use to set view of activity and popup are same but, they are different view instances, for the view set to the activity you have deletemtd in the activity code. But when you inflated the xml to a view for showing it in the popup at that place there is no deletemtd method., what you must do is set an explicit listener to that view.

     public void onButtonShowPopupWindowClick(View view) {
    
        // inflate the layout of the popup window
        LayoutInflater inflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
        View popupView = inflater.inflate(R.layout.activity_output_calculation, null);
    
        // create the popup window
        int width = LinearLayout.LayoutParams.MATCH_PARENT;
        int height = LinearLayout.LayoutParams.WRAP_CONTENT;
        boolean focusable = true; // lets taps outside the popup also dismiss it
        final PopupWindow popupWindow = new PopupWindow(popupView, width, height, focusable);
         popupView.findViewById<Button>(R.id.button).setOnClickListener(null);
         //or a listener
        popupView.findViewById<Button>(R.id.button).setOnClickListener(v->{/*your task here*/});
        // show the popup window
        // which view you pass in doesn't matter, it is only used for the window tolken
        popupWindow.showAtLocation(view, Gravity.CENTER, 0, 0);
    
        // dismiss the popup window when touched
        popupView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                popupWindow.dismiss();
                return true;
            }
        });
    
    }