警报对话框显示的空指针异常,仅适用于Android 6.0

时间:2016-03-20 20:00:48

标签: android alertdialog android-6.0-marshmallow findviewbyid numberpicker

当我尝试用Alert Dialog打开Number Picker时,我遇到了一个奇怪的问题。我应该在button设置为listener之后调用它:

private class ButtonClickListener implements View.OnClickListener {

        @Override
        public void onClick(View v) {
            AlertDialog.Builder builder = new AlertDialog.Builder(ImagesActivity.this);
            AlertDialog dialog;
            final NumberPicker np = new NumberPicker(ImagesActivity.this);
            np.setMinValue(1);
            np.setMaxValue(dataModel.getPagesNumber());
            np.setValue(currentPage);
            builder.setView(np);
            builder.setTitle(R.string.jump_title);
            builder.setPositiveButton(R.string.jump_ok, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    pager.setCurrentItem(np.getValue() - 1);
                    dialog.dismiss();
                }
            });
            builder.setNegativeButton(R.string.jump_cancel, new DialogInterface.OnClickListener() {
                public void onClick(DialogInterface dialog, int id) {
                    dialog.dismiss();
                }
            });

            dialog = builder.create();
            dialog.show();
        }
    }

ImagesActivity 是类,其中放置了ButtonClickListener。它显示ViewPager,应使用NumberPicker滚动到选定的页面。

在我的旧款手机上运行正常,但当我尝试在Android 6启动时,我收到了消息错误

  

java.lang.NullPointerException:尝试调用虚方法   ' android.view.View android.view.View.findViewById(int)'在null   对象参考         在com.android.internal.app.AlertController.setupView(AlertController.java:489)         在com.android.internal.app.AlertController.installContent(AlertController.java:234)         在android.app.AlertDialog.onCreate(AlertDialog.java:423)         在android.app.Dialog.dispatchOnCreate(Dialog.java:394)         在android.app.Dialog.show(Dialog.java:295)         在android.app.DialogFragment.onStart(DialogFragment.java:490)         在android.app.Fragment.performStart(Fragment.java:2244)         在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1002)         在android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)         在android.app.BackStackRecord.run(BackStackRecord.java:793)         在android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)         在android.app.FragmentManagerImpl $ 1.run(FragmentManager.java:482)         在android.os.Handler.handleCallback(Handler.java:739)         在android.os.Handler.dispatchMessage(Handler.java:95)         在android.os.Looper.loop(Looper.java:148)         在android.app.ActivityThread.main(ActivityThread.java:5417)         at java.lang.reflect.Method.invoke(Native Method)         在com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:726)         在com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

你知道它能引起什么吗?我该如何解决这个问题?

3 个答案:

答案 0 :(得分:4)

我设法解决了这个问题。

我不得不改变

import android.app.alertdialog;

import android.support.v7.app.alertdialog;

可能自Marshmallow版本以来出现了某种类型的变化,当我们对使用标准/支持版本的库不够谨慎时会导致问题。

答案 1 :(得分:2)

这意味着你弄乱了alertDialogStyle - 它从那里读取布局res id,如果它没有加载正确的布局,它将是NPE。

答案 2 :(得分:0)

尝试在LinearLayout或RelativeLayout中添加NumberPicker,然后将对话框视图设置为LinearLayout或RelativeLayout。

编辑: 您可以尝试将NumberPicker放在布局xml中并对其进行充气,并在setView方法调用中使用它