共有設定でリストを作成していますが、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であるリストを作成できるようにしたいと思います。これを行うための通常の方法は何ですか?
前もって感謝します、
ジェイ
プリファレンスをString
として入力し、Integer.parseInt()
を使用します。あなたが参照している制限に関するバグレポートが実際にあると思いますが、リンクが見つかりません。経験から、Strings
を使用して、自分自身を多くの欲求不満から救うように言うことができます。
他のSOユーザーへの注意、私が間違っていることを証明できれば、歓迎します。
アンドリューは正しかった、スレッドは ここ :
それはまだコメントされていますが、変更はありません(とにかく2.3.3の時点で)。
.valueOf()のInteger.parseInt()が機能する必要があります。 valueOf()がエラーなしで機能する場合は、parseInt()ほど割り当てられないため、これを使用します。これは、私のようにGCを回避する必要がある場合に役立ちます。
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>
これが私が使用する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
値を作成しています。試してみてください。すぐに機能する場合もあれば、追加の関数をオーバーライドする必要がある場合もあります。もしそうなら、これは良いスタートであり、あなたがそれを行う方法を示しています...