Mihai Bratulescu
Mihai Bratulescu

Reputation: 1945

Android alertdialog custom layout button onClickListener crashes

I have made a layout for my alertdialog and there I have a exit button that calls dialog.dismiss() and a few more that save data to preferences. I have set onClickListeners to all and my dialog does not have any button such as positive or negative, only the ones in the layout.

However the app crashes when calling the dialog.

08-20 07:58:01.291: E/AndroidRuntime(3297): FATAL EXCEPTION: main
08-20 07:58:01.291: E/AndroidRuntime(3297): java.lang.NullPointerException
08-20 07:58:01.291: E/AndroidRuntime(3297):   at com.xcommerce.androidstore.HomeScreen$21.onClick(HomeScreen.java:1183)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at android.view.View.performClick(View.java:4202)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at android.view.View$PerformClick.run(View.java:17340)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at android.os.Handler.handleCallback(Handler.java:725)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at android.os.Handler.dispatchMessage(Handler.java:92)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at android.os.Looper.loop(Looper.java:137)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at android.app.ActivityThread.main(ActivityThread.java:5039)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at java.lang.reflect.Method.invokeNative(Native Method)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at java.lang.reflect.Method.invoke(Method.java:511)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-20 07:58:01.291: E/AndroidRuntime(3297):   at dalvik.system.NativeStart.main(Native Method)
TextView sort = (TextView) findViewById(R.id.sorteaza);
        final Dialog sortDialog = new Dialog(this, R.style.DialogTheme);
        sort.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                LayoutInflater inflater = HomeScreen.this.getLayoutInflater();
                View sortView = inflater.inflate(R.layout.sort_layout, null);
                sortDialog.setContentView(sortView);
                WindowManager manager = (WindowManager) getSystemService(Activity.WINDOW_SERVICE);
                WindowManager.LayoutParams lp = new WindowManager.LayoutParams();
                lp.copyFrom(sortDialog.getWindow().getAttributes());
                lp.width = manager.getDefaultDisplay().getWidth();
                lp.height = manager.getDefaultDisplay().getHeight() - manager.getDefaultDisplay().getHeight()/5;
                sortDialog.getWindow().setAttributes(lp);
                sortDialog.show();
                //sort controls
                SharedPreferences sortPref = getSharedPreferences("SORT", 0);
                final SharedPreferences.Editor ed = sortPref.edit();

                Button exitSort, sortAZ, sortZA, sortCheap, sortExpensive;
                exitSort = (Button) findViewById(R.id.exitSort);
                sortAZ = (Button) findViewById(R.id.sortAZ);
                sortZA = (Button) findViewById(R.id.sortZA);
                sortCheap = (Button) findViewById(R.id.sortCheap);
                sortExpensive = (Button) findViewById(R.id.sortExpensive);

                exitSort.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        sortDialog.dismiss();
                    }
                });
                sortAZ.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        ed.putString("sort", "AZ");
                        ed.commit();
                    }
                });
                sortZA.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        ed.putString("sort", "ZA");
                        ed.commit();
                    }
                });
                sortCheap.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        ed.putString("sort", "cheap");
                        ed.commit();
                    }
                });
                sortExpensive.setOnClickListener(new View.OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        // TODO Auto-generated method stub
                        ed.putString("sort", "expensive");
                        ed.commit();
                    }
                });
            }
        });

Upvotes: 4

Views: 2941

Answers (2)

Tran Hieu
Tran Hieu

Reputation: 5374

your problem at line: sortDialog.dismiss();

the "sortDialog" is a DialogBuilder object, it's not a Dialog object.

So you need a variable to handle the dialog when call show() function. ex:

final Dialog dg = sortDialog.show();

and close dialog by "dg":

dg.dismiss();

Upvotes: 1

Raghunandan
Raghunandan

Reputation: 133560

You need to use the dialog object to initialize views. As suggested by Luksprog.

You inflate a custom view and set the same to the dialog. You have buttons in the layout you inflate. So use the dialog object to initialize your buttons.

exitSort = (Button) sortDialog.findViewById(R.id.exitSort);
sortAZ = (Button)  sortDialog.findViewById(R.id.sortAZ);
sortZA = (Button)  sortDialog.findViewById(R.id.sortZA);
sortCheap = (Button)  sortDialog.findViewById(R.id.sortCheap);
sortExpensive = (Button)  sortDialog.findViewById(R.id.sortExpensive); 

Upvotes: 3

Related Questions