Получение целочисленных или индексных значений из списка предпочтений - PullRequest
23 голосов
/ 08 марта 2011

Я создаю списки в общем предпочтении, и когда вызывается метод onPreferenceChanged (), я хочу извлечь индекс элемента в списке или целочисленное значение в некоторых случаях.Я пытаюсь построить данные XML следующим образом:

в массивах:

<string-array name="BackgroundChoices">
  <item>Dark Background</item>
  <item>Light Background</item> 
</string-array>
<array name="BackgroundValues">
  <item>1</item>
  <item>0</item> 
</array>
<string-array name="SpeedChoices">
  <item>Slow</item>
  <item>Medium</item>
  <item>Fast</item>
</string-array>    
<array name="SpeedValues">
  <item>1</item>
  <item>4</item>
  <item>16</item>
</array>

в файле настроек XML:

<PreferenceScreen android:key="Settings"  
   xmlns:android="http://schemas.android.com/apk/res/android"  
   android:title="Settings">

<ListPreference
        android:key="keyBackground"
        android:entries="@array/BackgroundChoices"
        android:summary="Select a light or dark background." 
        android:title="Light or Dark Background"  
        android:positiveButtonText="Okay"   
        android:entryValues="@array/BackgroundValues"/>
<ListPreference 
        android:key="keySpeed" 
        android:entries="@array/SpeedChoices" 
        android:summary="Select animation speed."
        android:title="Speed" android:entryValues="@array/SpeedValues"/>
</PreferenceScreen>

Так что мой XML неРабота.Я знаю, как это сделать, используя массив строк, а не массив для значений.И я мог бы вытащить строки значений и извлечь из них то, что мне нужно, но я бы предпочел (если это возможно) иметь списки, в которых значения были бы целочисленными значениями, логическими значениями или перечислениями.Как обычно это сделать?

заранее спасибо,

Jay

Ответы [ 4 ]

40 голосов
/ 08 марта 2011

Введите настройки как String и используйте Integer.parseInt().Я думаю, что на самом деле есть сообщение об ошибке на ограничение, на которое вы ссылаетесь, но я не могу найти ссылку.Исходя из своего опыта, я могу сказать вам, что просто используйте Strings и избавьте себя от многих разочарований.

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

10 голосов
/ 21 апреля 2011

Эндрю был прав, поток здесь :

он все еще комментируется, и все же без изменений (по состоянию на 2.3.3 в любом случае)..parseInt () из .valueOf () должен будет работать.Если valueOf () работает без ошибок, используйте его, так как он не выделяет столько, сколько parseInt (), полезно, когда вам НУЖНО избегать GC, как я.

5 голосов
/ 30 ноября 2013

На основе Android ListPreference я создал IntListPreference .Использование простое - просто поместите этот фрагмент в ваших предпочтениях xml:

<org.bogus.android.IntListPreference
    android:key="limitCacheLogs"
    android:defaultValue="20"
    android:entries="@array/pref_download_logs_count_titles"
    android:entryValues="@array/pref_download_logs_count_values"
    android:negativeButtonText="@null"
    android:positiveButtonText="@null"
    android:title="@string/pref_download_logs_count" 
/>    

и в strings.xml

<string name="pref_download_logs_count">Number of logs per cache</string>
<string-array name="pref_download_logs_count_titles">
    <item>10</item>
    <item>20</item>
    <item>50</item>
    <item>Give me all!</item>
</string-array>
<integer-array name="pref_download_logs_count_values">
    <item>10</item>
    <item>20</item>
    <item>50</item>
    <item>-1</item>
</integer-array>
0 голосов
/ 05 июля 2016

Вот класс ListIntegerPreference, который я использую (написано для com.android.support:preference-v7:24.0.0). Он переписывает несколько методов и конвертирует между Integer и String, где это возможно, так что база ListPreference не распознает, что вы работаете с Integers вместо Strings.

public class ListIntegerPreference extends ListPreference
{
    public ListIntegerPreference(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes)
    {
        super(context, attrs, defStyleAttr, defStyleRes);
    }

    public ListIntegerPreference(Context context, AttributeSet attrs, int defStyleAttr)
    {
        super(context, attrs, defStyleAttr);
    }

    public ListIntegerPreference(Context context, AttributeSet attrs)
    {
        super(context, attrs);
    }

    public ListIntegerPreference(Context context)
    {
        super(context);
    }

    @Override
    protected void onSetInitialValue(boolean restoreValue, Object defaultValue)
    {
        int defValue = defaultValue != null ? Integer.parseInt((String)defaultValue) : 0;
        int value = getValue() == null ? 0 : Integer.parseInt(getValue());
        this.setValue(String.valueOf(restoreValue ? this.getPersistedInt(value) : defValue));
    }

    @Override
    public void setValue(String value)
    {
        try
        {
            Field mValueField = ListPreference.class.getDeclaredField("mValue");
            mValueField.setAccessible(true);
            Field mValueSetField = ListPreference.class.getDeclaredField("mValueSet");
            mValueSetField.setAccessible(true);

            String mValue = (String)mValueField.get(this);
            boolean mValueSet = (boolean)mValueSetField.get(this);

            boolean changed = !TextUtils.equals(mValue, value);
            if(changed || !mValueSet)
            {
                mValueField.set(this, value);
                mValueSetField.set(this, mValueSet);
                this.persistInt(Integer.parseInt(value));
                if(changed) {
                    this.notifyChanged();
                }
            }
        }
        catch (NoSuchFieldException e)
        {
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            e.printStackTrace();
        }
    }
}

Я использую это для создания ListPreferences значений с помощью кода, просто попробуйте. Это может сработать сразу, или, может быть, вам нужно переопределить дополнительные функции. Если это так, это хорошее начало и показывает, как вы можете это сделать ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...