让用户从偏好屏幕中的一系列数字中进行选择
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 的键访问它。
我希望用户能够 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 的键访问它。