当我尝试用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)
你知道它能引起什么吗?我该如何解决这个问题?
答案 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方法调用中使用它