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

Let the user choose from a range of numbers in preference screen

我希望用户能够 enter/pick 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>

谢谢你

您可以做的不是扩展 PreferenceFragment,而是扩展 EditTextPreference。您可以覆盖 showDialog() 并在 showDialog() 中添加一个 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 的键访问它。