Android NumberPicker 空指针异常的原因是什么?

3

我正在尝试实现一个数字选择器来选择分钟值。

但是在这一行代码上我遇到了一个空指针异常:

minutePicker = (NumberPicker) findViewById(R.id.minuten_picker);

以下是代码:

public class MainActivity extends Activity {


NumberPicker minutePicker;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    // Auswahl Minuten zum starten / Stoppen aller
    minutePicker = new NumberPicker(MainActivity.this);
    minutePicker = (NumberPicker) findViewById(R.id.minuten_picker);
    minutePicker.setMaxValue(30);


    minutePicker.setOnValueChangedListener(new NumberPicker.OnValueChangeListener() {
        @Override
        public void onValueChange(NumberPicker picker, int oldVal, int newVal) {
            abschaltzeit = minutePicker.getValue();
        }
    });

    minutePicker.setValue(0);
    minutePicker.setWrapSelectorWheel(false);

}
}

XML:

<NumberPicker
    android:id="@+id/minuten_picker"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_row="6"
    android:layout_column="0"
    android:paddingLeft="20dp" />

日志:

09-25 11:00:09.749  10687-10687/de.carsten.awesome.app E/AndroidRuntime﹕ FATAL EXCEPTION: main
    Process: de.carsten.awesome.app, PID: 10687
    java.lang.RuntimeException: Unable to start activity ComponentInfo{de.carsten.awesome.app/de.carsten.awesome.app.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2184)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at de.carsten.awesome.app.MainActivity.onCreate(MainActivity.java:83)
            at android.app.Activity.performCreate(Activity.java:5231)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1087)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2148)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2233)
            at android.app.ActivityThread.access$800(ActivityThread.java:135)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1196)
            at android.os.Handler.dispatchMessage(Handler.java:102)
            at android.os.Looper.loop(Looper.java:136)
            at android.app.ActivityThread.main(ActivityThread.java:5001)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:515)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:785)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:601)
            at dalvik.system.NativeStart.main(Native Method)

清理你的项目,然后重新编译它。 - Batuhan Coşkun
1
请提供logcat日志。 - MysticMagicϡ
抱歉,没有改变,仍然出现 NPE。 - Steakschen
1
minutePicker = (NumberPicker) findViewById(R.id.minuten_picker); 这个语句不会导致 NullPointerException。请发布 logcat。 - Lei Guo
目前无法获取logcat,似乎是2秒调试器正在运行,建议重新启动Nexus和电脑。 - Steakschen
MainActivity.java:83 是什么? - MysticMagicϡ
2个回答

3
minutePicker = new NumberPicker(MainActivity.this);
minutePicker = (NumberPicker) findViewById(R.id.minuten_picker);

您正在通过编程方式创建一个NumberPicker,然后用findViewById()返回的内容覆盖引用。如果您的activity_main布局不包含一个minuten_picker,它将返回null。
  • 只选择另一种:要么以编程方式创建,要么从您的视图层次结构中找到。

  • 如果您选择编程方式new NumberPicker(),请记住将其添加到活动视图层次结构中的某个布局中,例如使用setContentView()

  • 如果您选择填充方式,请确保在XML布局文件中拥有该视图。

我猜测您看到的NPE实际上是在下一行,您正尝试在minutePicker上调用方法时出现了null。


我也尝试过没有这一行: minutePicker = new NumberPicker(MainActivity.this); 但你是正确的,在接下来的一行中获取了NPE - Steakschen

0

非常抱歉。

我将代码从MainActivity移动到创建Fragment中,并且它可以使用rootView.findView正常工作。

很抱歉,我对Fragment概念还不熟悉。

非常感谢您的帮助!


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