2011-01-21 2 views
4

Я хочу иметь EditTextPreference, который отключит кнопку OK, если в поле EditText нет текста. Я создал собственный класс EditTextPreference, и я могу получить объект EditText и установить TextWatcher, но я не могу найти способ отключить кнопку. Похоже, у меня просто нет доступа к кнопкам OK и Cancel в диалоговом окне.EditTextPreference Отключить кнопки?

Кто-нибудь знает, как добраться до этих кнопок или делать то, что я пытаюсь сделать?

Только другой вариант - попытаться создать с нуля пользовательский диалог, который выглядит и имитирует EditTextPreference.

+0

сделал и получить soultion? –

ответ

9

Вот пример кода, который включает/отключает кнопку в зависимости от того, возвращается ли функция onCheckValuetrue или false.

public class ValidatedEditTextPreference extends EditTextPreference 
{ 
    public ValidatedEditTextPreference(Context ctx, AttributeSet attrs, int defStyle) 
    { 
     super(ctx, attrs, defStyle);   
    } 

    public ValidatedEditTextPreference(Context ctx, AttributeSet attrs) 
    { 
     super(ctx, attrs);     
    } 

    private class EditTextWatcher implements TextWatcher 
    {  
     @Override 
     public void onTextChanged(CharSequence s, int start, int before, int count){} 

     @Override 
     public void beforeTextChanged(CharSequence s, int start, int before, int count){} 

     @Override 
     public void afterTextChanged(Editable s) 
     {   
      onEditTextChanged(); 
     } 
    } 
    EditTextWatcher m_watcher = new EditTextWatcher(); 

    /** 
    * Return true in order to enable positive button or false to disable it. 
    */ 
    protected boolean onCheckValue(String value) 
    {   
     return Strings.hasValue(value); 
    } 

    protected void onEditTextChanged() 
    { 
     boolean enable = onCheckValue(getEditText().getText().toString()); 
     Dialog dlg = getDialog(); 
     if(dlg instanceof AlertDialog) 
     { 
      AlertDialog alertDlg = (AlertDialog)dlg; 
      Button btn = alertDlg.getButton(AlertDialog.BUTTON_POSITIVE); 
      btn.setEnabled(enable);     
     } 
    } 

    @Override 
    protected void showDialog(Bundle state) 
    { 
     super.showDialog(state); 

     getEditText().removeTextChangedListener(m_watcher); 
     getEditText().addTextChangedListener(m_watcher); 
     onEditTextChanged(); 
    }  
} 
+0

все еще не вижу, как я могу получить доступ к кнопкам. Мне нужно отключить кнопку OK. То, что вы предлагаете, - это просто сделать мой собственный диалог. Если я возьму этот подход, я просто создам пользовательский класс Dialog. – Bob

+0

Я обновил ответ. Я сам проверил этот новый подход, и он работает для меня. – inazaruk

+0

Работает и для меня. – dmon

1

нужно изменить старый EditTextPreference к новому ValidatedEditTextPreference в preference.xml.

Я сделал следующее:

Старый код:

<EditTextPreference 
    android:dialogMessage="Please input your email" 
    android:dialogTitle="Set email" 
    android:key="Email" 
    android:summary="Your email" 
    android:title="-Missed call send to" android:defaultValue="[email protected]"/> 

Новый код:

<com.tanggod.missedcall2mail.ValidatedEditTextPreference 
    android:dialogMessage="Please input your email" 
    android:dialogTitle="Set email" 
    android:key="Email" 
    android:summary="Your email" 
    android:title="-Missed call send to" android:defaultValue="[email protected]"/> 
+1

Почему он * нужен * для изменения * нового * 'ValidatedEditTextPreference'? По-видимому, это не часть API, потому что вам нужно добавить другую библиотеку, чтобы она работала. Кроме того, вы отвечаете на то, что было задано 2 года назад, поэтому Бобу, возможно, не нужен конкретный ответ на эту проблему. – BLaZuRE

+0

Да, вы правы, я просто нахожу, что это 2 года назад. Потому что я модифицировал EditTextPreference для ValidatedEditTextPreference как путь inazaruk. Я просто продемонстрирую, как его использовать. – User9527

Смежные вопросы