Android-не удается найтиViewByid () в CustomViews

Я новичок в написании небольшого приложения для выбора времени из настраиваемого средства выбора времени, получения времени от него и его использования. Я получаю 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

Как мне обойти это?

Опубликуйте, пожалуйста, свой код addPreferencesFromResource.

aolphn 31.10.2018 06:41

Это не функция, которую я написал, это встроенная функция Android, используемая в PreferenceActivity.

Sonic_ 31.10.2018 06:45

Я думаю, вы не установилиContentView для своей активности.

aolphn 31.10.2018 06:46

setContentView () используется для Activity, а addPreferencesFromResource () используется для PreferenceActivity, addPreferencesFromResource () добавляет из папки «xml», а setContentView () добавляет из папки «layout».

Sonic_ 31.10.2018 06:50

возможно, вы можете проверить этот вопрос, он похож на вашу проблему.

aolphn 31.10.2018 06:56

Он не может получить доступ к любому идентификатору, моя проблема в том, что я не знаю, как получить доступ к TimePick из файла xml с помощью findViewById ().

Sonic_ 31.10.2018 07:09
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
6
81
2

Ответы 2

Попробуйте этот код

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.

Sonic_ 31.10.2018 09:24

Вы должны разрабатывать его по-другому. Вы должны расширить класс TimePick один раз для time_from и один раз для time_two. Установите onClickListener в расширенный класс, а не в класс PreferencesScreen. Вы должны сделать это, переопределив функцию onCreateDialogView, как это.

@Override protected View onCreateDialogView() { 
    picker=super.onCreateDialogView();
    picker.setOnTimeChangedListener(...);
    return(picker); 
} 

Затем в ваш XML поместите свой расширенный класс, а не класс TimePick.

Другие вопросы по теме