Android alertdialog 自定义布局按钮 onClickListener 崩溃

标签 android android-alertdialog onclicklistener

我为我的 alertdialog 做了一个布局,我有一个调用 dialog.dismiss() 的退出按钮和一些将数据保存到首选项的按钮。我已将 onClickListeners 设置为 all 并且我的对话框没有任何按钮,例如正面或负面,只有布局中的按钮。

但是,应用程序在调用对话框时崩溃。

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

最佳答案

您需要使用对话框对象来初始化 View 。正如 Luksprog 所建议的。

您扩充自定义 View 并将其设置为对话框。你在你膨胀的布局中有按钮。因此,请使用对话框对象来初始化您的按钮。

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

关于Android alertdialog 自定义布局按钮 onClickListener 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18329843/

相关文章:

android - 有没有办法完全阻止在 Android 中截取屏幕截图的功能?

android - 从服务器加载图像

java - 将 AlertDialog 转换为布局

android - 为什么 ViewHolder 上的 OnClickListener 不起作用?

android - 在自定义 View 中覆盖空方法并在 MainActivity 中处理它

android - 如何在可通过 USB 访问的外部存储中创建文件/文件夹?

android - 在 Android 的 Nutiteq 3D 中绘制路线

android - Android Studio 中的alertDialog 倒计时

android - AlertDialogs setCustomTitle 不适用于 android.support.v7.app.AlertDialog

java - 如何使对话框中的整个 View 可点击?