即使给出了正确的引用,在 TextView 上获取空对象引用

Getting null object reference on TextView even when correct reference has been given

我有一个 AppCompatSpinner,我想在这里 TextView 上设置一个文本。

这是我的代码:

eSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

                final TextView eSpinnerTV = (TextView) adapterView.getSelectedView();

                switch (i) {
                    case 0:
                        final Calendar c = Calendar.getInstance();
                        mHourEnd = c.get(Calendar.HOUR_OF_DAY);
                        mMinuteEnd = c.get(Calendar.MINUTE);

                        TimePickerDialog timePickerDialog = new TimePickerDialog(activityName.this,
                                new TimePickerDialog.OnTimeSetListener() {

                                    @Override
                                    public void onTimeSet(TimePicker view, int hourOfDay,
                                                          int minute) {

                                        Calendar date = Calendar.getInstance();
                                        date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                                        date.set(Calendar.MINUTE, minute);
                                        date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));

                                        sEnd(hourOfDay, minute);

                                        uTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());

                                        eString = new SimpleDateFormat("hh:mm a").format(date.getTime());

                                        // error on the line below
                                        eSpinnerTV.setText(uTimeAMPM);

                                    }
                                }, mHourEnd, mMinuteEnd, false);
                        timePickerDialog.show();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });

这里是 sEnd.java 文件的代码:

public void sEnd(int hour, int min) {
        if (hour == 0) {
            hour += 12;
            format = "AM";
        } else if (hour == 12) {
            format = "PM";
        } else if (hour > 12) {
            hour -= 12;
            format = "PM";
        } else {
            format = "AM";
        }

        uTimeAMPM = hour + ":" + min + " " + format;

    }

这是 xml 代码:

<android.support.v7.widget.AppCompatSpinner
       android:id="@+id/pTime"
       android:layout_width="wrap_content"
       android:layout_height="wrap_content"
       android:layout_marginTop="8dp"
       android:layout_marginBottom="8dp"
       android:entries="@array/pTimeList"
       style="@style/Base.Widget.AppCompat.Spinner">
</android.support.v7.widget.AppCompatSpinner>

这是pTimeList

<string-array name="pTimeList">
    <item>Pick a time..</item>
</string-array>

在从 TimePickerDialog 中选择时间后单击 OK 按钮后,应用程序崩溃并给出此错误:java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TextView.setText(java.lang.CharSequence)' on a null object reference 在上面代码中指定的行.

即使此文本视图已在上面的代码中明确引用为 final TextView eSpinnerTV = (TextView) adapterView.getSelectedView();,导致此错误的原因是什么?

请告诉我。

不使用 adapterView,而是使用 view 对象的第二个参数 onItemSelected 从 Spinner 获取选定的行视图:

final TextView eSpinnerTV = (TextView)view.findViewById(android.R.id.text1);

像这样

eSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {

                **final TextView eSpinnerTV = (TextView) adapterView.getChildAt(position)**

                switch (i) {
                    case 0:
                        final Calendar c = Calendar.getInstance();
                        mHourEnd = c.get(Calendar.HOUR_OF_DAY);
                        mMinuteEnd = c.get(Calendar.MINUTE);

                        TimePickerDialog timePickerDialog = new TimePickerDialog(activityName.this,
                                new TimePickerDialog.OnTimeSetListener() {

                                    @Override
                                    public void onTimeSet(TimePicker view, int hourOfDay,
                                                          int minute) {

                                        Calendar date = Calendar.getInstance();
                                        date.set(Calendar.HOUR_OF_DAY, hourOfDay);
                                        date.set(Calendar.MINUTE, minute);
                                        date.set(Calendar.AM_PM, date.get(Calendar.AM_PM));

                                        sEnd(hourOfDay, minute);

                                        uTimeInSF = new SimpleDateFormat("HH:mm:ss").format(date.getTime());

                                        eString = new SimpleDateFormat("hh:mm a").format(date.getTime());

                                        // error on the line below
                                        eSpinnerTV.setText(uTimeAMPM);

                                    }
                                }, mHourEnd, mMinuteEnd, false);
                        timePickerDialog.show();
                }
            }

            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {

            }
        });