2016-11-23 3 views
0

Краткий обзор:Android: onPreferenceChange с проверкой

Я построил проверки, которая работает с onPreferenceChanged на примере проекта разработан только для проверки параметров и как они сохраняются и такие. Функциональность все там и работает, как я этого хочу. Я надеялся, что смогу перенести эту функциональность в созданный по умолчанию класс SettingsActivity, поскольку он, как представляется, обеспечивает прочную функциональность и очень необходимые заголовки для расширения программы.

Сам код, который я хотел бы реализовать, - это то, что представлено ниже. Очень коротко у меня есть чек, который решает, нужно ли выполнить конкретную проверку или нет, и если это так придает конкретный, в противном случае он присоединяется к общему. Я считаю, что это хакерский метод и хотел бы, если возможно, альтернативы.

// Type of verification checking to attach 
public void attachOnPreferenceChangedListener(Preference dsp_pref) { 
    if (dsp_pref.getKey().equals("et_targetPref")) { 
     attachTargetVerifier(dsp_pref); 
    } else { // Any non verifier specific is given a generic listen with summary updater 
     attachGenericVerifier(dsp_pref); 
    } 
} 

private void attachGenericVerifier(Preference dsp_pref) { 
    dsp_pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      updatePrefSummary(preference); 
      return true; 
     } 
    }); 
} 

private void attachTargetVerifier(Preference dsp_pref) { 
    dsp_pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() { 
     @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      Pattern dsl_pattern = Pattern.compile(URL_REGEX,Pattern.CASE_INSENSITIVE); 
      Matcher dsl_matcher = dsl_pattern.matcher(newValue.toString()); 

      if (!dsl_matcher.matches()) { 
       Toast.makeText(getActivity(), "Invalid URL. Example: http://example.com/target", Toast.LENGTH_LONG).show(); 
      } else if (dsl_matcher.group(1).toLowerCase().endsWith("/target")) { 
       Toast.makeText(getActivity(), "Preference Saved", Toast.LENGTH_LONG).show(); 
       updatePrefSummary(preference); 
       return true; 
      } else if(dsl_matcher.group(2) == null) { 
       Toast.makeText(getActivity(), "URL must start with 'http://'", Toast.LENGTH_LONG).show(); 
      } else { 

      } 
      return false; 
     } 
    }); 
} 

Что SettingsActivity по умолчанию предоставляет только простой и прямой OnPreferenceChange переопределение, что, вероятно, означает, что проверка проверка должна быть интегрирована здесь, если более элегантный метод не существует, и в этом случае я все уши:

private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     if (preference instanceof ListPreference) { 
      // For list preferences, look up the correct display value in 
      // the preference's 'entries' list. 
      ListPreference listPreference = (ListPreference) preference; 
      int index = listPreference.findIndexOfValue(stringValue); 

      // Set the summary to reflect the new value. 
      preference.setSummary(
        index >= 0 
          ? listPreference.getEntries()[index] 
          : null); 

     } else if (preference instanceof RingtonePreference) { 
      // For ringtone preferences, look up the correct display value 
      // using RingtoneManager. 
      if (TextUtils.isEmpty(stringValue)) { 
       // Empty values correspond to 'silent' (no ringtone). 
       preference.setSummary(R.string.pref_ringtone_silent); 

      } else { 
       Ringtone ringtone = RingtoneManager.getRingtone(
         preference.getContext(), Uri.parse(stringValue)); 

       if (ringtone == null) { 
        // Clear the summary if there was a lookup error. 
        preference.setSummary(null); 
       } else { 
        // Set the summary to reflect the new ringtone display 
        // name. 
        String name = ringtone.getTitle(preference.getContext()); 
        preference.setSummary(name); 
       } 
      } 

     } else { 
      // For all other preferences, set the summary to the value's 
      // simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 
}; 

Цените какие-либо рекомендации о том, как это может быть сделано без него становится неуправляемым

+0

Также обратите внимание на бит конфликта из-за того, что sBindPreferenceSummaryToValueListener является статичным, делая любое типичное предупреждение «Тосты» как ответ невероятным, если я не могу как-то разрешить контекст. Все еще не уверен, как это сделать. – Ben

ответ

0

решение, для тех, кто заинтересован, а не полной и 100% это поместить небольшой блок проверки в верхней части, если проверка не пройдена возврат ложного осуществляется:

private static Preference.OnPreferenceChangeListener sBindPreferenceSummaryToValueListener = new Preference.OnPreferenceChangeListener() { 
    @Override 
    public boolean onPreferenceChange(Preference preference, Object value) { 
     String stringValue = value.toString(); 

     /////////////////////////////////////////////////////////////////// 
     // Preference Validation Section 
     /////////////////////////////////////////////////////////////////// 

     // URL Check: http://whatev.er/targetstore 
     if (preference.getKey().equals("connect_url")) { 
      Pattern dsl_pattern = Pattern.compile(URL_REGEX,Pattern.CASE_INSENSITIVE); 
      Matcher dsl_matcher = dsl_pattern.matcher(stringValue); 

      if (dsl_matcher.matches() && // Match! 
        dsl_matcher.group(1).toLowerCase().endsWith("/targetstore")) { // Confirmed validity 
       Toast.makeText(dsl_context, "Preference Saved", Toast.LENGTH_LONG).show(); 
      } else { // No match - don't save data. 
       Toast.makeText(dsl_context, "Invalid URL. Example: http://example.com/targetstore", Toast.LENGTH_LONG).show(); 
       return false; // Stops result from saving 
      } 
     } 
     if (preference instanceof ListPreference) { 
      //List Pref setSummary 

     } else if (preference instanceof RingtonePreference) { 
      //Ringtone Pref setSummary 
     } else { 
      // For all other preferences, set the summary to the value's 
      // simple string representation. 
      preference.setSummary(stringValue); 
     } 
     return true; 
    } 
}; 

Существует еще вопрос всякий раз, когда настройки будут загружены приглашения «Предпочтение сохранено». Некоторая проверка, проверяя, читаются ли данные и не заданы, может помочь решить эту проблему, но я не знаю такой проверки.

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