我正在尝试使用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>
答案 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");
干杯;)