2016-07-24 48 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> 

THANK YOU

回答

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中,可以通過您給EditText的密鑰進行操作。

+0

對不起格式不好。我自己格式化了它。 –

+0

謝謝,但我不明白在哪裏放置這段代碼,我不知道attrubuteSet是什麼。我只是複製了你的類並替換了我的_SettingsFragment_類。我想我也應該對_Preferences_類進行一些修改? – drogaleggera

+0

@drogaleggera在實現這個類之後你必須做的唯一事情是。您必須在xml中的「EditTextPrefernce」位置使用新類。我也通過詳細的解釋修改了我的答案。對於任何查詢,請隨時詢問。 –