2016-07-24 47 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”位置使用新类。我也通过详细的解释修改了我的答案。对于任何查询,请随时询问。 –