警报对话框显示空指针异常,仅在 Android 6.0 上
Null Pointer Exception on Alert Dialog show, only on Android 6.0
当我尝试打开其中包含 Number Picker
的 Alert Dialog
时,我遇到了一个奇怪的问题。它应该在我按下 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 是 class,其中 ButtonClickListener
被放置。它显示 ViewPager
,应该滚动到使用 NumberPicker
选择的页面。
它在我的旧手机上运行良好,但是当我尝试在 Android
6 上启动它时,我收到消息 error:
java.lang.NullPointerException: Attempt to invoke virtual method
'android.view.View android.view.View.findViewById(int)' on a null
object reference
at com.android.internal.app.AlertController.setupView(AlertController.java:489)
at com.android.internal.app.AlertController.installContent(AlertController.java:234)
at android.app.AlertDialog.onCreate(AlertDialog.java:423)
at android.app.Dialog.dispatchOnCreate(Dialog.java:394)
at android.app.Dialog.show(Dialog.java:295)
at android.app.DialogFragment.onStart(DialogFragment.java:490)
at android.app.Fragment.performStart(Fragment.java:2244)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1002)
at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148)
at android.app.BackStackRecord.run(BackStackRecord.java:793)
at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535)
at android.app.FragmentManagerImpl.run(FragmentManager.java:482)
at android.os.Handler.handleCallback(Handler.java:739)
at android.os.Handler.dispatchMessage(Handler.java:95)
at android.os.Looper.loop(Looper.java:148)
at android.app.ActivityThread.main(ActivityThread.java:5417)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
你知道它是由什么引起的吗?我该如何解决?
尝试在 LinearLayout 或 RelativeLayout 中添加 NumberPicker,然后将对话框视图设置为该 LinearLayout 或 RelativeLayout。
编辑:
您可以尝试将 NumberPicker 放在布局 xml 中并对其进行膨胀,然后在 setView 方法调用中使用它
我设法解决了这个问题。
我不得不改变
import android.app.alertdialog;
到
import android.support.v7.app.alertdialog;
可能自 Marshmallow 版本以来发生了某种类型的变化,当我们在使用 standard/support 版本的库时不够小心时会导致问题。
这意味着您搞砸了 alertDialogStyle - 它从那里读取布局资源 ID,如果它没有加载正确的布局,它将 NPE。
当我尝试打开其中包含 Number Picker
的 Alert Dialog
时,我遇到了一个奇怪的问题。它应该在我按下 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 是 class,其中 ButtonClickListener
被放置。它显示 ViewPager
,应该滚动到使用 NumberPicker
选择的页面。
它在我的旧手机上运行良好,但是当我尝试在 Android
6 上启动它时,我收到消息 error:
java.lang.NullPointerException: Attempt to invoke virtual method 'android.view.View android.view.View.findViewById(int)' on a null object reference at com.android.internal.app.AlertController.setupView(AlertController.java:489) at com.android.internal.app.AlertController.installContent(AlertController.java:234) at android.app.AlertDialog.onCreate(AlertDialog.java:423) at android.app.Dialog.dispatchOnCreate(Dialog.java:394) at android.app.Dialog.show(Dialog.java:295) at android.app.DialogFragment.onStart(DialogFragment.java:490) at android.app.Fragment.performStart(Fragment.java:2244) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1002) at android.app.FragmentManagerImpl.moveToState(FragmentManager.java:1148) at android.app.BackStackRecord.run(BackStackRecord.java:793) at android.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1535) at android.app.FragmentManagerImpl.run(FragmentManager.java:482) at android.os.Handler.handleCallback(Handler.java:739) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:148) at android.app.ActivityThread.main(ActivityThread.java:5417) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
你知道它是由什么引起的吗?我该如何解决?
尝试在 LinearLayout 或 RelativeLayout 中添加 NumberPicker,然后将对话框视图设置为该 LinearLayout 或 RelativeLayout。
编辑: 您可以尝试将 NumberPicker 放在布局 xml 中并对其进行膨胀,然后在 setView 方法调用中使用它
我设法解决了这个问题。
我不得不改变
import android.app.alertdialog;
到
import android.support.v7.app.alertdialog;
可能自 Marshmallow 版本以来发生了某种类型的变化,当我们在使用 standard/support 版本的库时不够小心时会导致问题。
这意味着您搞砸了 alertDialogStyle - 它从那里读取布局资源 ID,如果它没有加载正确的布局,它将 NPE。