2013-02-22 7 views
1

Я небольшой шаг для завершения процедуры проверки числовых предпочтений.
Я заменил кнопку EditTextPrefernce OK onClickListener, чтобы избежать выхода из диалогового окна, если запись не является числовой.
Я использую TextWatcher.afterTextChanged, чтобы проверить, является ли запись числовой или нет, и я поместил правильную оценку тега EditText.
Все работает хорошо, нажав OK, когда запись недействительна, не покидает диалоговое окно, нажимая «ОК», когда запись действительна ... здесь Мне нужно вызвать оригинальную кнопку OK onClick, , но я не нашел, как для этого. Есть функции просмотра функции callOnClick() и performOnClick(), но я просмотрел их код, и они предназначены для вызова установленного слушателя, а не оригинального.Android Проверка правильности для EditTextPreference

@Override 
public void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG, "+ onCreate(savedInstanceState:" + savedInstanceState + ")"); 
    super.onCreate(savedInstanceState); 

    ... 

    prefMaxLogs = (EditTextPreference) findPreference(getText(R.string.pref_maxLogs_key)); 
    prefMaxLogsEt = prefMaxLogs.getEditText(); 
    prefMaxLogsEt.setSingleLine(); 
    prefMaxLogsEt.setOnFocusChangeListener(ofcl); 
    prefMaxLogsEt.addTextChangedListener(tw); 

    ... 

    Log.d(TAG, "- onCreate()"); 
} 

private OnFocusChangeListener ofcl = new OnFocusChangeListener() { 
    @Override 
    public void onFocusChange(View v, boolean hasFocus) { 
     Log.d(TAG, "+ onFocusChange(v:" + v + ", hasFocus:" + hasFocus + ")"); 
     if(hasFocus) { 
      prefMaxLogsEt.selectAll(); 
      Dialog dialog = prefMaxLogs.getDialog(); 
      if(dialog != null) { 
       dialog.findViewById(android.R.id.button1).setOnClickListener(ocl); 
      } 
     } 
     Log.d(TAG, "- onFocusChange()"); 
    } 
}; 

private OnClickListener ocl = new OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Log.d(TAG, "+ onClick(v:" + v + ")"); 
     Boolean valid = !(Boolean) prefMaxLogsEt.getTag(R.string.invalidEntry); 
     if(valid) { 
      Log.d(TAG, "Valid et"); 
     } 
     Log.d(TAG, "- onClick()"); 
    } 
}; 

private TextWatcher tw = new TextWatcher() { 
    @Override 
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {} 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, int count) {} 
    @Override 
    public void afterTextChanged(Editable s) { 
     Log.d(TAG, "+ afterTextChanged(s:" + s + ")"); 
     String source = s.toString(); 
     //prefMaxLogsEt.removeTextChangedListener(this); 
     if(!source.matches("^[0-9]+$")) { 
      prefMaxLogsEt.getBackground().setColorFilter(getResources().getColor(R.color.invalid), Mode.SRC_IN); 
      prefMaxLogsEt.invalidate(); 
      prefMaxLogsEt.setError(getText(R.string.invalidEntry)); 
      prefMaxLogsEt.selectAll(); 
      prefMaxLogsEt.setTag(R.string.invalidEntry, true); 
     } else { 
      prefMaxLogsEt.setError(null); 
      prefMaxLogsEt.getBackground().clearColorFilter(); 
      prefMaxLogsEt.invalidate(); 
      prefMaxLogsEt.setTag(R.string.invalidEntry, false); 
     } 
     //prefMaxLogsEt.addTextChangedListener(this); 
     Log.d(TAG, "- afterTextChanged()"); 
    } 
}; 

The onClickListener устанавливается, когда EditText получает фокус, потому что я знаю, что диалог уже показывает.
OnClickListener предотвращает закрытие диалогового окна с недопустимыми записями

+1

Почему бы не просто использовать 'preference.onPreferenceChangedListener()'? –

+0

@AleksG Я ответил на это решение, когда вы разместили свой комментарий. – ilomambo

ответ

1

Я нашел другой способ проверить EditTextPreference. Установка OnPreferenceChangeListener и реализация onPreferenceChange.

@Override 
public boolean onPreferenceChange(Preference preference, Object newValue) { 
    Log.d(TAG, "+ onPreferenceChange(preference:" + preference + ", newValue:" + newValue + ")"); 
    Boolean rv = true; 
    if(preference.equals(prefMaxLogs)) { 
     String source = newValue.toString(); 
     if(!source.matches("^[0-9]+$")) { 
      rv = false; 
     } 
    } 
    Log.d(TAG, "- onPreferenceChange()"); 
    return rv; 
} 

Эта функция имеет то преимущество, что она возвращает логическое значение, правда, если принять изменения, ложь, если вы отвергаете их.
Я опустил onFocusListener и onClickListener для кнопки OK, так проще.
Я все еще использую setColorFilter и afterTextChanged, чтобы предупредить пользователя о недопустимых вводах. Если пользователь нажмет OK, диалог закроется, но будет принято только допустимое значение.

Этот слушатель устанавливается индивидуально для каждого предпочтения, так что это моя инициализация в OnCreate()

prefMaxLogs = (EditTextPreference) findPreference(getText(R.string.pref_maxLogs_key)); 
    prefMaxLogsEt = prefMaxLogs.getEditText(); 
    prefMaxLogsEt.setSingleLine(); 
    prefMaxLogsEt.addTextChangedListener(tcl); 
    prefMaxLogs.setOnPreferenceClickListener(this); 
Смежные вопросы