onBindDialogView не вызывается - почему?

Я пытаюсь реализовать подкласс ListPreference, и пока его конструктор вызывается (после его отображения), его переопределение onBindDialogView не вызывается.

  public MyListPreference(Context context, AttributeSet attrs) {
    super(context, attrs);
    // TODO Auto-generated constructor stub
    Log.v(TAG, "MyListPreference constructed.");
  }


  @Override
  protected void onBindDialogView(View view) {
    super.onBindDialogView(view);
    Log.v(TAG, "onBindDialogView called");    
  }

Почему это происходит? Что мне не хватает?

Обновление: я поместил сообщение журнала в onCreateDialogView() и он вызывается тоже.

Это всего лишь onBindDialogView() который не вызывается.

Почему? Каковы условия для вызова этого обратного вызова?


person scatmoi    schedule 22.06.2013    source источник
comment
Что вы пытаетесь сделать в onBindDialogView()?   -  person ozbek    schedule 26.06.2013
comment
@shoerat Я пытаюсь setOnTouchListener() в ListPreference.   -  person scatmoi    schedule 27.06.2013


Ответы (1)


Что возвращает ваш onCreateDialogView()? onBindDialogView() вызывается только в том случае, если вы возвращаете оттуда ненулевое пользовательское представление. Кроме того, onBindDialogView() вызывается только тогда, когда вы действительно показываете предпочтение. Ссылка: Источник код DialogPreference. В частности, см. метод showDialog()

Если вы просто вернете суперреализацию из своего onCreateDialogView(), я подозреваю, что она вернет null.

person curioustechizen    schedule 26.06.2013
comment
Мой onCreateDialogView() возвращает то, что возвращает его super.onCreateDialogView(): null. Как заставить его возвращать ненулевое значение без изменения исходного представления/макета ListPreference? Я действительно не хочу ничего менять в представлении/макете. Все, что я действительно хочу, это получить дескриптор/ссылку на исходное представление ListPreference. Это вообще возможно? Если да, то как? +1 и спасибо на данный момент. - person scatmoi; 27.06.2013
comment
Кажется, не существует общедоступного API для получения дескриптора ListView, который находится в ListPreference. У вас есть DialogPreference#getDialog(), который вы можете преобразовать в AlertDialog(), а оттуда вы можете сделать getListView(), но это зависит от многих деталей реализации, и я бы не рекомендовал это делать. Я бы посоветовал вам создать собственный Preference, где у вас есть полный контроль над представлением содержимого. - person curioustechizen; 27.06.2013
comment
На самом деле см. этот комментарий, но вы ответили на мой вопрос так ну так прием+баунти. - person scatmoi; 28.06.2013
comment
Как вы получаете весь диалог и устанавливаете его направление (например, чтобы поддерживать его в RTL)? - person android developer; 26.05.2014