2014-02-21 5 views
1

Я использую PreferenceFragment в своем приложении. Отображается при выборе из списка. Класс довольно простой:PreferenceFragment onPreferenceTreeClick not firing

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"); 
    } 
} 

Он отлично работает на небольшом устройстве. Проблема возникает, когда я запускаю планшет в альбомной ориентации. Если я нажму «Настройки» в списке «Список», слева, MyPreferencesFragment появится справа. Затем я могу выбрать любые настройки и изменить их значения. Проблема возникает, когда я просматриваю список настроек. Как только я это сделаю, нажатие любого из элементов в списке предпочтений ничего не делает. Я добавил:

@Override 
public Boolean onPreferenceTreeClick (PreferenceScreen preferenceScreen, Preference preference) { 

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

, чтобы узнать, может ли это пролить свет на ситуацию. Он вызывается, когда все работает, но как только я просматриваю список, он больше не вызывается. Кто-нибудь знает, что мне нужно сделать, чтобы выбрать предпочтение после прокрутки? больше

Две точки данных:

  • Он отлично работает в портретной ориентации.

  • Если я нажму кнопку питания, чтобы выключить дисплей (пока отображается список предпочтений), когда я снова включу экран, я могу выбрать элементы даже после прокрутки. При повторном выборе настроек из списка в этой точке возникает исходная проблема.

EDIT:

Я заметил, что он прекрасно работает на небольшом устройстве, но это, кажется, иногда имеют один и тот же вопрос с небольшими устройствами. Есть предположения?

ответ

0

Оказалось, что проблема была в одном из классов предпочтений, которые я создал. Я расширил класс 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); 
    }  
}