24

共有設定でリストを作成しています。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、boolean、または enum であるリストを作成できるようにしたいと考えています。これを行う慣習的な方法は何ですか?

前もって感謝します、

ジェイ

4

4 に答える 4

41

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

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

于 2011-03-08T02:05:13.810 に答える
10

アンドリューは正しかった、スレッドはここにあります:

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

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

于 2011-04-21T01:00:21.093 に答える
5

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>
于 2013-11-30T01:13:23.687 に答える
0

これが私が使用するListIntegerPreferenceクラスです(のために書かれていますcom.android.support:preference-v7:24.0.0)。いくつかのメソッドを上書きし、可能な場合はIntegerとの間で変換するため、 の代わりに使用していることをStringベースListPreferenceが認識しません。IntegersStrings

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コードを介して値を作成するためにこれを使用しています。試してみてください。すぐに機能する場合もあれば、追加の機能をオーバーライドする必要がある場合もあります。もしそうなら、これは良いスタートであり、あなたがそれを行う方法を示しています...

于 2016-07-05T20:28:27.243 に答える