我在我的应用程序中使用PreferenceFragment。从ListFragment中选择时会显示它。这门课非常基本:
public class MyPreferencesFragment extends PreferenceFragment {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// load the preferences from an XML resource
addPreferencesFromResource(R.xml.preferences);
}
@Override
public void onResume() {
super.onResume();
getActivity().setTitle("Preferences");
}
}它在小型设备上工作得很好。当我在平板电脑上运行时,问题就发生了。如果单击左侧ListFragment中的“首选项”,则MyPreferencesFragment将显示在右侧。然后,我可以选择任何首选项并更改它们的值。当我滚动“首选项”列表时,会出现问题。一旦我这样做,单击“首选项”列表中的任何一项都不会有任何效果。我补充说:
@Override
public Boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference) {
System.out.println("preference " + preference.getKey() + " selected");
return super.onPreferenceTreeClick(preferenceScreen, preference);
}看看这是否能说明目前的情况。当事情正常运行时,它被调用,但是一旦我滚动列表,它就不再被调用。有人知道我需要做什么才能在滚动后选择一个偏好吗?
另外两个数据点:
编辑:
我评论说,它在小型设备上工作得很好,但它有时也会对小型设备产生同样的问题。有什么想法吗?
发布于 2014-03-07 14:46:38
原来问题出在我创建的一个偏好类中。我扩展了EditTextPreference类,以确保输入的值是一个数字,并在适当的范围内。最初的类如下所示:
public class NumberWithRangePreference extends EditTextPreference {
private int min = -1;
private int max = -1;
private int defaultValue = -1;
private int oldValue = -1;
private String units = "";
public NumberWithRangePreference(Context context, AttributeSet attrs) {
super(context, attrs);
for (int i=0; i<attrs.getAttributeCount(); ++i) {
String attr = attrs.getAttributeName(i);
if (attr.equals("min")) {
min = Integer.parseInt(attrs.getAttributeValue(i));
} else if (attr.equals("max")) {
max = Integer.parseInt(attrs.getAttributeValue(i));
} else if (attr.equals("units")) {
units = attrs.getAttributeValue(i);
} else if (attr.equals("defaultValue" )) {
defaultValue = Integer.parseInt(attrs.getAttributeValue(i));
oldValue = defaultValue;
}
}
}
@Override
protected View onCreateView(ViewGroup group) {
View view = super.onCreateView(group);
oldValue = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getContext()).getString(getKey(), "" + defaultValue));
setSummary(oldValue + " " + units);
return view;
}
@Override
protected void onBindView(View view) {
super.onBindView(view);
oldValue = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getContext()).getString(getKey(), "" + defaultValue));
setSummary(oldValue + " " + units);
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
int value = Integer.parseInt(getEditText().getEditableText().toString());
if ((value < min) || (value > max)) {
getEditText().setText("" + oldValue);
AlertDialog.Builder errorDialog = new AlertDialog.Builder(getContext());
errorDialog.setTitle("Invalid Entry");
errorDialog.setMessage("Value should be between " + min + " and " + max + " " + units);
errorDialog.setPositiveButton("OK", null);
errorDialog.show();
}
}
super.onClick(dialog, which);
}
}onCreateView和onBindView操作有时会导致PreferenceFragment停止响应项目单击,尽管我不知道原因。这与setSummary调用有关,因为如果我在onCreateView和onBindView中注释掉这些调用,一切都是可以选择的。
在查看了其他一些示例之后,我将类修改为以下内容,现在它运行得很好:
public class NumberWithRangePreference extends EditTextPreference {
private int min = -1;
private int max = -1;
private int defaultValue = -1;
private int oldValue = -1;
private String units = "";
public NumberWithRangePreference(Context context, AttributeSet attrs) {
super(context, attrs);
for (int i=0; i<attrs.getAttributeCount(); ++i) {
String attr = attrs.getAttributeName(i);
if (attr.equals("min")) {
min = Integer.parseInt(attrs.getAttributeValue(i));
} else if (attr.equals("max")) {
max = Integer.parseInt(attrs.getAttributeValue(i));
} else if (attr.equals("units")) {
units = attrs.getAttributeValue(i);
} else if (attr.equals("defaultValue" )) {
defaultValue = Integer.parseInt(attrs.getAttributeValue(i));
oldValue = defaultValue;
}
}
oldValue = Integer.parseInt(PreferenceManager.getDefaultSharedPreferences(getContext()).getString(getKey(), "" + defaultValue));
setSummary("" + oldValue + " " + units);
}
@Override
public void onClick(DialogInterface dialog, int which) {
if (which == DialogInterface.BUTTON_POSITIVE) {
int value = Integer.parseInt(getEditText().getEditableText().toString());
if ((value < min) || (value > max)) {
getEditText().setText("" + oldValue);
AlertDialog.Builder errorDialog = new AlertDialog.Builder(getContext());
errorDialog.setTitle("Invalid Entry");
errorDialog.setMessage("Value should be between " + min + " and " + max + " " + units);
errorDialog.setPositiveButton("OK", null);
errorDialog.show();
} else {
setSummary("" + value + " " + units);
}
}
super.onClick(dialog, which);
}
}https://stackoverflow.com/questions/21942760
复制相似问题