web-dev-qa-db-ja.com

リスト設定から整数値またはインデックス値を取得する

共有設定でリストを作成していますが、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は機能しません。値の配列ではなく文字列配列を使用してこれを行う方法を知っています。そして、値の文字列を引き出して、そこから必要なものを導き出すこともできますが、(可能であれば)値がint、booleans、またはenumであるリストを作成できるようにしたいと思います。これを行うための通常の方法は何ですか?

前もって感謝します、

ジェイ

24
jbww

プリファレンスをStringとして入力し、Integer.parseInt()を使用します。あなたが参照している制限に関するバグレポートが実際にあると思いますが、リンクが見つかりません。経験から、Stringsを使用して、自分自身を多くの欲求不満から救うように言うことができます。

他のSOユーザーへの注意、私が間違っていることを証明できれば、歓迎します。

41
Andrew White

アンドリューは正しかった、スレッドは ここ

それはまだコメントされていますが、変更はありません(とにかく2.3.3の時点で)。

.valueOf()のInteger.parseInt()が機能する必要があります。 valueOf()がエラーなしで機能する場合は、parseInt()ほど割り当てられないため、これを使用します。これは、私のようにGCを回避する必要がある場合に役立ちます。

10
bclymer

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>
5
Boguś

これが私が使用するListIntegerPreferenceクラスです(com.Android.support:preference-v7:24.0.0用に書かれています)。いくつかのメソッドを上書きし、可能な場合はIntegerStringの間で変換するため、ベース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値を作成しています。試してみてください。すぐに機能する場合もあれば、追加の関数をオーバーライドする必要がある場合もあります。もしそうなら、これは良いスタートであり、あなたがそれを行う方法を示しています...

0
prom85