Search code examples
androidandroid-popupwindow

using a switch inside a popup


I am trying to create a filter function, I have a pop up window in my Search activity it displays list of switches where the user can turn some of them off and on.. I got the pop up to display fine but whenever I tick any switch the value is not being passed to the search activity and not doing anything. here is my codes: search Activity snippet:

filter.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            initiatePopupWindow();
        }
    });

popup function (inside SearchActivity)

        private void initiatePopupWindow() {
        try {
// We need to get the instance of the LayoutInflater
            LayoutInflater inflater = (LayoutInflater)SearchActivity.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            View layout = inflater.inflate(R.layout.activity_filter,
                    (ViewGroup) findViewById(R.id.popup_element));
            pwindo = new PopupWindow(layout ,ViewGroup.LayoutParams.WRAP_CONTENT,
                    ViewGroup.LayoutParams.WRAP_CONTENT,true);

            pwindo.showAtLocation(layout, Gravity.CENTER, 0, 0);

            switch1 = (Switch) findViewById(R.id.parking);
            switch2 = (Switch) findViewById(R.id.delivery);
            switch3 = (Switch) findViewById(R.id.reservation);
            switch4 = (Switch) findViewById(R.id.bar);
            switch5 = (Switch) findViewById(R.id.card);
            switch6 = (Switch) findViewById(R.id.wifi);
            switch7 = (Switch) findViewById(R.id.terrace);

            btnClosePopup = (Button) layout.findViewById(R.id.btn_close_popup);
            btnClosePopup.setOnClickListener(cancel_button_click_listener);

            switch1.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
                @Override
                public void onCheckedChanged(CompoundButton compoundButton, boolean bChecked) {
                    if (bChecked) {
                        parking_filter=1;
                        Toast.makeText(getApplicationContext(),
                                "Searching Database using : " + parking_filter,
                                Toast.LENGTH_SHORT).show();

                    } else {
                        parking_filter=0;
                        Toast.makeText(getApplicationContext(),
                                "Searching Database using : " + parking_filter,
                                Toast.LENGTH_SHORT).show();
                    }
                }
            });

activity_filter.xml (switches)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/popup_element"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:background="@color/cardview_light_background"
android:padding="10sp" >
    <Switch
        android:id="@+id/delivery"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Has Delivery"
        android:layout_below="@+id/reservation"
        android:layout_alignParentStart="true" />

    <Switch
        android:id="@+id/parking"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Has Parking"
        android:layout_marginTop="20dp"
        android:layout_alignParentTop="true"
        android:layout_alignParentStart="true" />
    <Switch
        android:id="@+id/reservation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Takes Reservations"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/terrace"
        android:layout_alignParentStart="true" />
    <Switch
        android:id="@+id/terrace"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="outdoor seating"
        android:layout_below="@+id/bar"
        android:layout_alignParentStart="true" />
    <Switch
        android:id="@+id/wifi"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Has Wifi"
        android:layout_below="@+id/parking"
        android:layout_alignParentStart="true" />

    <Switch
        android:id="@+id/bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginTop="20dp"
        android:text="Has Bar"
        android:layout_below="@+id/wifi"
        android:layout_alignParentStart="true" />

    <Switch
        android:id="@+id/card"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Accept Cards"
        android:layout_marginTop="20dp"
        android:layout_below="@+id/delivery"
        android:layout_alignParentStart="true" />

<Button
    android:id="@+id/btn_close_popup"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="Close"
    android:layout_below="@+id/card" />


</RelativeLayout>

I am using "toast" to keep track of the "parking filter" value but with no avail. in the log

java.lang.NullPointerException: Attempt to invoke virtual method 'void        android.widget.Switch.setOnCheckedChangeListener(android.widget.CompoundButton$OnCheckedChangeListener)' on a null object reference

Solution

  • Your switch is null because you are looking for it in wrong place. You must find view by id in exact layout that you inflating; Change this

    switch1 = (Switch) findViewById(R.id.parking); 
    

    to this

    switch1 = (Switch) layout.findViewById(R.id.parking);