Android-не может найти ViewByid () в пользовательских представлениях - PullRequest
0 голосов
/ 31 октября 2018

Я новичок в написании кода для небольшого приложения, которое выбирает время из пользовательского выбора времени, получает время из него и использует его. Я получаю 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: попытка вызвать виртуальный метод 'void android.widget.TimePicker.setOnTimeChangedListener (android.widget.TimePicker $ OnTimeChangedListener)' для ссылки на нулевой объект

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

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

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

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

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

0 голосов
/ 31 октября 2018

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

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");
   }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...