2014-02-18 2 views
2

이 질문에 대한 많은 답변을 읽었지만 내 질문은 코드를 어디에 넣어야하는지 묻습니다. edittextPreference에서 숫자가 100보다 큰지 확인하려고합니다. 이 코드는 내가 preferecnes를 채우는 데 사용됩니다 :editTextPreference 유효성 검사 Android

public class SettingsFrag extends PreferenceFragment{ 

    //Override onCreate so that the code will run when the activity is started. 
    @Override 
    public void onCreate(Bundle savedInstanceState){   
      //Call to the super class. 
      super.onCreate(savedInstanceState); 

      //add the preferences from the XML file. 
      addPreferencesFromResource(R.xml.preferences); 
    } 

}

내가 유효성 검사를 추가하거나 내가 다른 클래스를 생성 할 것입니다 여기에 있습니까?

preferences.xml로 :

<EditTextPreference    
     android:key="geofence_range"    
     android:title="Geofence Size"    
     android:defaultValue="500"  
     android:inputType="number" 
     android:summary="Geofence Size Around User Location"    
     android:dialogTitle="Enter Size (meters):" /> 

답변

8

사용자에 대한 데이터 입력의 유효성을 검사 addPreferencesFromResourceEditTextPreference에 대한 setOnPreferenceChangeListener 추가 :

EditTextPreference edit_Pref = (EditTextPreference) 
        getPreferenceScreen().findPreference("geofence_range"); 
    edit_Pref.setOnPreferenceChangeListener(new OnPreferenceChangeListener() { 

    @Override 
     public boolean onPreferenceChange(Preference preference, Object newValue) { 
      // put validation here.. 
      if(<validation pass>){ 
       return true; 
      }else{ 
       return false; 
      } 
     } 
    }); 
4

허. 안드로이드에서 쉽게 익숙해 져야하지만 그렇지 않은 것들 중 또 하나. 다른 대답은 조용히 결과를 환경 설정에 다시 쓰는 것을 막습니다. (토스트를 보여주는 것은 덜 장난 스럽지만 여전히 장난 스럽다.)

이렇게하려면 맞춤 설정이 필요합니다. 필요에 맞게 onValidate를 사용자 정의하십시오.

package com.two_play.extensions; 

import android.app.AlertDialog; 
import android.content.Context; 
import android.content.DialogInterface; 
import android.os.Bundle; 
import android.preference.EditTextPreference; 
import android.util.AttributeSet; 
import android.view.View; 
import android.widget.EditText; 

public class ValidatingEditTextPreference extends EditTextPreference { 
    public ValidatingEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) { 
     super(context, attrs, defStyleAttr, defStyleRes); 
    } 

    public ValidatingEditTextPreference(Context context, AttributeSet attrs, int defStyleAttr) { 
     super(context, attrs, defStyleAttr); 
    } 

    public ValidatingEditTextPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public ValidatingEditTextPreference(Context context) { 
     super(context); 
    } 

    @Override 
    protected void showDialog(Bundle state) { 
     super.showDialog(state); 
     AlertDialog dlg = (AlertDialog)getDialog(); 
     View positiveButton = dlg.getButton(DialogInterface.BUTTON_POSITIVE); 
     getEditText().setError(null); 
     positiveButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       onPositiveButtonClicked(v); 
      } 
     }); 
    } 

    private void onPositiveButtonClicked(View v) { 
     String errorMessage = onValidate(getEditText().getText().toString()); 
     if (errorMessage == null) 
     { 
      getEditText().setError(null); 
      onClick(getDialog(),DialogInterface.BUTTON_POSITIVE); 
      getDialog().dismiss(); 
     } else { 
      getEditText().setError(errorMessage); 
      return; // return WITHOUT dismissing the dialog. 
     } 
    } 

    /*** 
    * Called to validate contents of the edit text. 
    * 
    * Return null to indicate success, or return a validation error message to display on the edit text. 
    * 
    * @param text The text to validate. 
    * @return An error message, or null if the value passes validation. 
    */ 
    public String onValidate(String text) 
    { 
     try { 
      Double.parseDouble(text); 
      return null; 
     } catch (Exception e) 
     { 
      return getContext().getString(R.string.error_invalid_number); 
     } 
    } 
}