Я новичок в написании небольшого приложения для выбора времени из настраиваемого средства выбора времени, получения времени от него и его использования. Я получаю NullRefrenceError.
Мой файл xml:
<PreferenceScreen xmlns:android = "http://schemas.android.com/apk/res/android"
android:layout_width = "match_parent"
android:layout_height = "match_parent"
android:key = "init_Settings">
<PreferenceCategory
android:title = "Set-Time">
<com.lambdahash.sonic.ui_app.fragments.TimePick
android:id = "@+id/from_time"
android:title = "Time from"
android:defaultValue = "--:--"
android:summary = "--:--"
android:key = "time-from"
/>
<com.lambdahash.sonic.ui_app.fragments.TimePick
android:id = "@+id/to_time"
android:title = "Time to"
android:summary = "--:--"
android:defaultValue = "--:--"
android:key = "time-to"
/>
</PreferenceCategory>
Здесь TimePick - это java-класс, который отлично подходит для выбора времени.
Код:
public class TimePick extends DialogPreference {
private int lastHour=0;
private int lastMinute=0;
private TimePicker picker=null;
public static int getHour(String time) {
String[] pieces=time.split(":");
return(Integer.parseInt(pieces[0]));
}
public static int getMinute(String time) {
String[] pieces=time.split(":");
return(Integer.parseInt(pieces[1]));
}
public TimePick(Context ctxt, AttributeSet attrs) {
super(ctxt, attrs);
setPositiveButtonText("Set");
setNegativeButtonText("Cancel");
}
@Override
protected View onCreateDialogView() {
picker=new TimePicker(getContext());
return(picker);
}
@Override
protected void onBindDialogView(View v) {
super.onBindDialogView(v);
picker.setCurrentHour(lastHour);
picker.setCurrentMinute(lastMinute);
}
@Override
protected void onDialogClosed(boolean positiveResult) {
super.onDialogClosed(positiveResult);
if (positiveResult) {
lastHour=picker.getCurrentHour();
lastMinute=picker.getCurrentMinute();
String time=String.valueOf(lastHour)+":"+String.valueOf(lastMinute);
if (callChangeListener(time)) {
persistString(time);
}
}
}
@Override
protected Object onGetDefaultValue(TypedArray a, int index) {
return(a.getString(index));
}
}
Вот где я получаю сообщение об ошибке:
public class generalSettings extends PreferenceActivity{
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
addPreferencesFromResource(R.xml.general_settings);
TimePicker time_from = (TimePicker) findViewById(R.id.from_time);
TimePicker time_to = (TimePicker) findViewById(R.id.to_time);
time_from.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
//ts.timeFrom();
Log.d("TESTF:",hourOfDay+":"+minute+"\n");
}
});
}
}
Получающий
java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.TimePicker.setOnTimeChangedListener(android.widget.TimePicker$OnTimeChangedListener)' on a null object reference
Как мне обойти это?
Это не функция, которую я написал, это встроенная функция Android, используемая в PreferenceActivity.
Я думаю, вы не установилиContentView для своей активности.
setContentView () используется для Activity, а addPreferencesFromResource () используется для PreferenceActivity, addPreferencesFromResource () добавляет из папки «xml», а setContentView () добавляет из папки «layout».
возможно, вы можете проверить этот вопрос, он похож на вашу проблему.
Он не может получить доступ к любому идентификатору, моя проблема в том, что я не знаю, как получить доступ к TimePick из файла xml с помощью findViewById ().




Попробуйте этот код
Preference time_from = findPreference("time-from");
time_from.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
//ts.timeFrom();
Log.d("TESTF:",hourOfDay+":"+minute+"\n");
}
});
Preference time_to= findPreference("time-to");
time_from.setOnTimeChangedListener(new TimePicker.OnTimeChangedListener() {
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
//ts.timeTo();
Log.d("TESTF:",hourOfDay+":"+minute+"\n");
}
});
findPreference("time-from"); находит предпочтения, а .setOnTimeChangedListener может применяться только к TimePick, поскольку он расширяет DialogPreference.
Вы должны разрабатывать его по-другому. Вы должны расширить класс TimePick один раз для time_from и один раз для time_two. Установите onClickListener в расширенный класс, а не в класс PreferencesScreen. Вы должны сделать это, переопределив функцию onCreateDialogView, как это.
@Override protected View onCreateDialogView() {
picker=super.onCreateDialogView();
picker.setOnTimeChangedListener(...);
return(picker);
}
Затем в ваш XML поместите свой расширенный класс, а не класс TimePick.
Опубликуйте, пожалуйста, свой код addPreferencesFromResource.