Android – Как установить значение для CheckBoxPreference? Или же?

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

Я разбираю XML для этих категорий, поэтому PreferenceScreen выполняется программно, а все CheckBoxPreferences строятся в цикле. Код:

try {
    URL url = new URL("http://www.someurl.com/phone/categories.php");

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
    DocumentBuilder db = dbf.newDocumentBuilder();
    Document doc = db.parse(new InputSource(url.openStream()));
    doc.getDocumentElement().normalize();

    NodeList nodeList = doc.getElementsByTagName("category");

    for (int i = 0; i < nodeList.getLength(); i++) {                
        Element category = (Element)nodeList.item(i);

        Node id = category.getElementsByTagName("id").item(0);
        Node title = category.getElementsByTagName("name").item(0);

        CheckBoxPreference togglePref = new CheckBoxPreference(this);
        togglePref.setKey("category_" + id.getChildNodes().item(0).getNodeValue());
        togglePref.setDefaultValue(true);
        togglePref.setTitle(title.getChildNodes().item(0).getNodeValue());
        root.addPreference(togglePref);
    }
} catch(Exception ex) {
    Log.e(this.getClass().getSimpleName(), ex.getMessage());
}

где root — это PreferenceScreen объект.

Моя проблема в том, что мне нужно хранить не только заголовок для одного флажка, но мне также нужно хранить идентификатор категории, но в объекте CheckBoxPreference такого свойства нет.

Мой вопрос заключается в том, есть ли другой обходной путь или мне следует расширить класс CheckBoxPreference и создать некоторый пользовательский MyCheckBoxPreference, который также будет хранить другое «значение»?

Мое видение состоит в том, чтобы иметь что-то похожее (или то же самое), что и обычный флажок HTML - хотя он имеет значение, оно не установлено (отправлено), если флажок не установлен, а с другой стороны, когда установлен флажок, вы получаете конкретное значение вместо просто true/false ...

Насколько мне известно, CheckBoxPreference имеет только проверенное/непроверенное состояние, в то время как значение, которое можно было бы вернуть, отсутствует.

Я думал о том, чтобы установить ключи предпочтений только на идентификатор конкретных категорий вместо category_<ID>, а затем вызвать sharedPreferences.getAll() - я ожидаю, что должны быть возвращены только проверенные CheckBoxPreferences, а затем, получив их ключи, я должен иметь возможность работать с идентификаторами категорий ... Может ли это быть простым решением и хорошим подходом???

Большое спасибо за любой дельный совет!!!


person shadyyx    schedule 19.04.2011    source источник


Ответы (1)


Моя проблема в том, что мне нужно сохранить не только заголовок для одного параметра флажка, но мне также нужно сохранить идентификатор категории, но в объекте CheckBoxPreference такого свойства нет.

ИМХО, для этого и нужен ключ.

Я думал о том, чтобы установить ключи предпочтений только для идентификатора конкретных cetagories вместо category_, а затем вызвать sharedPreferences.getAll() - я ожидаю, что должны быть возвращены только проверенные CheckBoxPreferences, а затем, получив их ключи, я должен иметь возможность работать с идентификаторами категорий... Может ли это быть простым решением и хорошим подходом???

Вы получите все CheckBoxPreference объекты, к которым прикоснулся пользователь, независимо от того, отмечены они или нет. Наверное, это правильный подход.

person CommonsWare    schedule 19.04.2011
comment
Хорошо, я думал, что ключ похож на уникальный идентификатор предпочтения, а не на его значение... Но я попробую... - person shadyyx; 20.04.2011
comment
@shadyyx: это уникальный идентификатор предпочтения. Однако для логического состояния вам не нужно никакого другого значения, кроме идентификатора и того, проверено ли оно. - person CommonsWare; 20.04.2011
comment
@CommonsWare возможно ли изменить состояние флажка в зависимости от условия, а не в зависимости от того, нажимает ли пользователь на него или нет? - person Rain Man; 28.05.2016
comment
@RainMan: Эм, вы имеете в виду setChecked()? - person CommonsWare; 28.05.2016
comment
@CommonsWare дело в том, что я хочу использовать checkboxpreference для покупки приложения, поэтому, если покупка не удалась, снимите флажок, а в случае успеха установите флажок. Но, что бы я ни делал, галочка ставится, даже если покупка не удалась. Я задал вопрос здесь. Любая помощь будет оценена. - person Rain Man; 28.05.2016