2016-07-24 4 views
0

사용자가 300에서 2000 사이의 숫자를 입력하거나 선택할 수 있기를 바랍니다. EditTextPreference를 사용하는 것이 좋지만 확인 방법을 모르겠습니다. 값이 실제로 범위 내에있는 경우. 나는 환경 설정 화면에 새로운 있습니다.사용자가 환경 설정 화면에서 숫자 범위에서 선택하도록 허용

내 Preferences.java

public class Preferences extends AppCompatActivity { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     setContentView(R.layout.simple); 
     FragmentManager fragmentManager = getFragmentManager(); 
     FragmentTransaction fragmentTransaction = fragmentManager.beginTransaction(); 
     SettingsFragment settingsFragment = new SettingsFragment(); 
     fragmentTransaction.add(android.R.id.content, settingsFragment, "SETTINGS_FRAGMENT"); 
     fragmentTransaction.commit(); 

    } 


    public static class SettingsFragment extends PreferenceFragment{ 

     @Override 
     public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      addPreferencesFromResource(R.xml.pref_layout); 
     } 
    } 


} 

그리고 pref_layout.xml (그것은 단지 하나 개의 기호를 포함합니다)

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen xmlns:android="http://schemas.android.com/apk/res/android"> 
    <PreferenceCategory 
     android:title="General"> 

     <EditTextPreference 
      android:title="frequency" 
      android:summary="frequency" 
      android:key="interval" 
      android:defaultValue="300" 
      android:numeric="integer"/> 


    </PreferenceCategory> 


</PreferenceScreen> 

가 할 수있는 일

답변

0

대신을 확장하는 것입니다 감사합니다 PreferenceFragment, 할 수있는 일은 EditTextPreference입니다. 그리고 showDilog()을 무시하고 showDilog()에서 TextWatcher을 추가 할 수 있습니다. 코드는 다음과 유사해야합니다.

public static class InputValueEditTextPreference extends EditTextPreference { 

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

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

     EditText et = getEditText(); 
     et.addTextChangedListener(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) { 
    Dialog d = getDialog(); 
    int num = Integer.parseInt(s.getText().toString()); 
    if (d instanceof AlertDialog) { 
     AlertDialog dialog = (AlertDialog) d; 
     Button positiveButton = dialog.getButton(AlertDialog.BUTTON_POSITIVE); 
     // Check the EditText value 
     if (num >= 300 && num <= 2000) { 
      // Enable OK button 
      positiveButton.setEnabled(true); 
     } else { 
      // Disable the button. 
      positiveButton.setEnabled(false); 
     } 
    } 
    } 
}); 
} 
} 

그리고

이제 XML 파일은

<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

<<package name>.InputValueEditTextPreference 
    android:title="@string/pref_input_value_label" 
    android:key="@string/pref_input_value_key" 
    android:defaultValue="@string/pref_input_value_default" 
    android:inputType="number" 
    android:singleLine="true" /> 

이것이하는 일은 그것을 편집 텍스트에 삽입 된 값을 기준으로 확인 버튼을 비활성화입니다해야합니다.

이제 사용자가 입력 한 값은 SharedPrefrence에 저장되며 편집 텍스트에 지정한 키를 사용하여 값을 입력 할 수 있습니다.

+0

서식이 잘못되어 죄송합니다. 나는 그것을 직접 포맷했다. –

+0

감사합니다.하지만이 코드를 어디에 둘 것인지 이해할 수 없으며 attrubuteSet이 무엇인지 알지 못합니다. 방금 클래스를 복사하고 _SettingsFragment_ 클래스를 바꿨습니다. 나는 _Preferences_ 클래스에도 약간의 수정을해야한다고 생각하니? – drogaleggera

+0

@drogaleggera이 클래스를 구현 한 후에해야 할 일은 다음과 같습니다. XML에서'EditTextPrefernce' 대신에 새로운 클래스를 사용해야합니다. 나는 또한 나의 대답을 상세한 설명으로 수정했다. 모든 질문에 대해 언제든지 물어보십시오. –