安卓AlertDialog自定义布局按钮的点击事件导致崩溃

4

我已经为我的alertdialog制作了一个布局,其中有一个退出按钮,调用dialog.dismiss(),还有一些保存数据到偏好设置的按钮。我对所有按钮设置了onClickListeners,并且我的对话框没有任何肯定或否定的按钮,只有在布局中的这些按钮。

然而,在调用对话框时该应用程序会崩溃。

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

请发布您的对话框代码。 - Steve Benett
2
希望你正在寻找使用dialog.findViewById()来查找按钮,或者直接在你用来设置为内容视图的视图上查找。另外,请不要在问题标题前加上Android前缀,底部的标签已经足够了。 - user
请把你的代码放上来,这样我们才能帮助你。 - Developer
忽略我从首选项获取数据的代码,我已经注释掉了,这不是问题。 - Mihai Bratulescu
1
你需要使用对话框对象来初始化视图。exitSort = (Button) sortDialog.findViewById(R.id.exitSort)。其他的也是如@Luksprog所建议的一样。 - Raghunandan
@MihaiBratulescu 将其作为答案发布。您可以使用findViewById查找当前视图层次结构设置到活动中。 - Raghunandan
2个回答

3
你需要使用对话框对象来初始化视图。如Luksprog所建议的那样。
你需要填充一个自定义视图并将其设置为对话框。你在填充的布局中有按钮。因此,使用对话框对象来初始化你的按钮。
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); 

1

您在第sortDialog.dismiss();行遇到了问题。

"sortDialog"是一个DialogBuilder对象,而不是Dialog对象。

因此,在调用show()函数时,需要一个变量来处理对话框。例如:

final Dialog dg = sortDialog.show();

and close dialog by "dg":

dg.dismiss();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接