2015-06-20 3 views
-1

Пользователь вводит IP-адрес в EditTextPreference, и я стараюсь, чтобы проверить IP с этим кодом:Validating IP никогда не удается

private EditTextPreference ipPref; 
private Matcher matcher; 
private SharedPreferences settings; 
private final Pattern IP_ADDRESS 
    = Pattern.compile(
    "((25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9])\\.(25[0-5]|2[0-4]" 
    + "[0-9]|[0-1][0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1]" 
    + "[0-9]{2}|[1-9][0-9]|[1-9]|0)\\.(25[0-5]|2[0-4][0-9]|[0-1][0-9]{2}" 
    + "|[1-9][0-9]|[0-9]))"); 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    addPreferencesFromResource(R.xml.settings); 

    //PREF_IP is the android:key of the EditTextPreference 
    ipPref = (EditTextPreference) getPreferenceManager().findPreference("PREF_IP"); 
    settings = PreferenceManager.getDefaultSharedPreferences(this); 
    matcher = IP_ADDRESS.matcher(settings.getString("PREF_IP", "0.0.0.0")); 

ipPref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {    
     public boolean onPreferenceChange(Preference preference, Object newValue) { 

      try 
      { 
       if(matcher.matches()){ 
        Log.d("settings", "matches!"); 
        return true; 
       }else{ 
        Log.d("settings", "doesn't match!"); 
        return false; 
       } 
      } 
      catch(Exception e) 
      { 
       return false; 
      } 
     } 
    }); 
} 

Если я ввести действительный IP-адрес, код никогда не видит его как действительным, и log говорит, что «не соответствует!». Что я делаю не так?

+0

Вы должны создать свой Искатель в методе 'onPreferenceChange()' вместо создания его заранее. –

+0

@GuillaumePolet, который ничего не меняет. – glass

+0

Да, это все меняет. Но я не уверен, что ваше регулярное выражение правильно –

ответ

1

Измените тест в методе onPreferenceChange(), чтобы:

IP_ADDRESS.matcher(newValue.toString()).matches() 
Смежные вопросы