首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >PreferenceFragment onPreferenceTreeClick不开火

PreferenceFragment onPreferenceTreeClick不开火
EN

Stack Overflow用户
提问于 2014-02-21 18:49:31
回答 1查看 2.1K关注 0票数 1

我在我的应用程序中使用PreferenceFragment。从ListFragment中选择时会显示它。这门课非常基本:

代码语言:javascript
复制
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将显示在右侧。然后,我可以选择任何首选项并更改它们的值。当我滚动“首选项”列表时,会出现问题。一旦我这样做,单击“首选项”列表中的任何一项都不会有任何效果。我补充说:

代码语言:javascript
复制
@Override
public Boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference) {

  System.out.println("preference " + preference.getKey() + " selected");
  return super.onPreferenceTreeClick(preferenceScreen, preference);
}

看看这是否能说明目前的情况。当事情正常运行时,它被调用,但是一旦我滚动列表,它就不再被调用。有人知道我需要做什么才能在滚动后选择一个偏好吗?

另外两个数据点:

  • 它在肖像定位方面很好。
  • 如果我单击电源按钮关闭显示(同时显示首选项列表),当我打开屏幕时,即使在滚动之后也可以选择项目。此时从列表中重新选择首选项会导致原来的问题。

编辑:

我评论说,它在小型设备上工作得很好,但它有时也会对小型设备产生同样的问题。有什么想法吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-03-07 14:46:38

原来问题出在我创建的一个偏好类中。我扩展了EditTextPreference类,以确保输入的值是一个数字,并在适当的范围内。最初的类如下所示:

代码语言:javascript
复制
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中注释掉这些调用,一切都是可以选择的。

在查看了其他一些示例之后,我将类修改为以下内容,现在它运行得很好:

代码语言:javascript
复制
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);
  }    
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21942760

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档