即使在setContentView()之后调用,findViewById()上的空对象引用错误

时间:2019-02-28 00:59:32

标签: java android

我正在尝试使用findViewById()获取SeekBar的实例,并将侦听器附加到该实例。

代码如下:

SeekBar seek_bar = findViewById(R.id.audio_volume);
seek_bar.setOnSeekBarChangeListener(listener);

听众:

private SeekBar.OnSeekBarChangeListener listener = new SeekBar.OnSeekBarChangeListener() {
        @Override
        public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
            log.d("YO HERE");
        }

        @Override
        public void onStartTrackingTouch(SeekBar seekBar) {

        }

        @Override
        public void onStopTrackingTouch(SeekBar seekBar) {

        }
    };

跟随this SO post,并在这两行之后在findViewById方法内调用onCreate

super.onCreate(savedInstanceState);
setContentView(R.layout.main);

但是问题仍然存在。我仍然得到:

java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.SeekBar.setOnSeekBarChangeListener(android.widget.SeekBar$OnSeekBarChangeListener)' on a null object reference

该应用无法打开。我该如何解决这个问题?如果共享调试空对象引用错误的过程,也将非常有帮助。

布局xml:

    <?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
  xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">
  <ListPreference
   android:key="PREF_MIN_REC"
   android:title="@string/min_rec"
   android:summary="@string/min_rec_desc"
   android:entries="@array/min_rec_options"
   android:entryValues="@array/min_rec_values"
   android:dialogTitle="@string/min_rec"
   android:defaultValue="15"
  />
  <ListPreference
   android:key="PREF_AUDIO_SOURCE"
   android:title="@string/audio_source"
   android:summary="@string/audio_source_desc"
   android:entries="@array/audio_source_options"
   android:entryValues="@array/audio_source_values"
   android:dialogTitle="@string/audio_source"
   android:defaultValue="4"
  />
  <ListPreference
    android:key="PREF_AUDIO_FORMAT"
    android:title="@string/audio_format"
    android:summary="@string/audio_format_desc"
    android:entries="@array/audio_format_options"
    android:entryValues="@array/audio_format_values"
    android:dialogTitle="@string/audio_format"
    android:defaultValue="1"
  />
    <org.anasthase.androidseekbarpreference.SeekBarPreference
        android:id="@+id/volume"
        android:key="PREF_MIC_VOLUME"
        android:title="@string/mic_volume"
        android:summary="@string/mic_volume_desc"
        app:maxValue="100"
        app:minValue="1"
        app:stepValue="1"
        android:defaultValue="20"
        app:format="%.1f"
        app:displayDividerValue="5"/>

  <org.anasthase.androidseekbarpreference.SeekBarPreference
          android:id="@+id/audio_volume"
          android:key="PREF_AUDIO_VOLUME"
          android:title="@string/audio_volume"
          android:summary="@string/audio_volume_desc"
          app:maxValue="100"
          app:minValue="1"
          app:stepValue="1"
          android:defaultValue="20"
          app:format="%.1f"
          app:displayDividerValue="5"/>


  <EditTextPreference
    android:key="PREF_URL_SUBDOMAIN"
    android:title="@string/server_subdomain"
    android:summary="@string/server_subdomain_desc"
    android:dialogTitle="@string/server_subdomain"
    android:defaultValue=".telforce.biz"
  />
  <ListPreference
      android:key="PREF_UPLOAD_NETWORK"
      android:title="@string/upload_network"
      android:summary="@string/upload_network_desc"
      android:entries="@array/upload_network_options"
      android:entryValues="@array/upload_network_values"
      android:dialogTitle="@string/upload_network"
      android:defaultValue="1"
      />

  <CheckBoxPreference
    android:key="save_term_enable_key"
    android:title="@string/save_term_check_title"
    android:summary="@string/save_term_check_summary"/>
  <EditTextPreference
    android:key="save_term_key"
    android:title="@string/save_term_title"
    android:summary="@string/save_term_summary"
    android:dependency="save_term_enable_key"
    android:defaultValue="@string/save_term_default_value"
    android:dialogTitle="@string/save_term_dialog"/>

</PreferenceScreen>

2 个答案:

答案 0 :(得分:1)

在您的XML中,audio_volume视图属于类 org.anasthase.androidseekbarpreference.SeekBarPreference

在您的Java代码中,它仅是SeekBar,因此,如果未崩溃,则假定Seekbar扩展了SeekBarPreference。

如果您使用的是Java,android sdk和目标api的最新版本,则自从去年以来就不再需要这些注释和响应。

空指针异常表示在布局上未找到搜索栏。检查您是否有多个具有相同名称的xml(用于不同的屏幕分辨率)。

答案 1 :(得分:0)

如果它的首选项片段为

SeekBarPreference skp = (SeekBarPreference) findPreference("PREF_AUDIO_VOLUME"); 

干杯;)