让用户从偏好屏幕中的一系列数字中进行选择

时间:2016-07-24 15:42:44

标签: android android-preferences

我希望用户能够在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>

谢谢你

1 个答案:

答案 0 :(得分: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" />

这样做是根据插入编辑文本的值禁用ok按钮。

现在,用户输入的值将保存到SharedPrefrence中,该值可以通过您为EditText提供的密钥进行处理。