Preferenceの初期値取得方法

1,962 views
Skip to first unread message

Kuchinashi

unread,
Feb 7, 2011, 3:17:14 AM2/7/11
to 日本Androidの会
はじめまして.Kuchinashiと申します.
Preferenceに関する質問が有るのですが,ご教授いただければ幸いです.

MainActivityで設定を取得するのに,onCreate()でPreferenceActivityのユーザ定義関数にアクセスしていま
す.

// ApplicationSettings.javaのstatic関数
public static void loadSettings(Context context) {
SharedPreferences sp =
PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().commit();
Map<String, ?> map = sp.getAll();
settings = new HashMap<String, String>();
for(String key : map.keySet()) {
settings.put(key, map.get(key).toString());
}
}

// MainActivity.javaからアクセス
ApplicationSettings.loadSettings(context);

このあと,settings.get(key)で設定値を取得しているのですが,アプリの初回起動などで設定値が設定されていない場合などはgetして
もnullが返ってくるため,所々でnullPointerExceptionが発生してしまいます.
皆様はこのあたりどのように実装されているのでしょうか?
もしくは,nullだった場合,同じkeyのdefaultValue値を取得する方法などは有りますでしょうか?

どうぞよろしくお願い致します.

yanagi

unread,
Feb 7, 2011, 4:49:54 AM2/7/11
to android-g...@googlegroups.com
Kuchinashiさん

高柳と申します。

SharedPreferencesに保存されている値は、基本的にはキー名が決まっているかと思いますので、
SharedPreferences#getAllを使わずに、
SharedPreferences#getStringなどを使われてはいかがでしょうか。

個別に取得するgetStringやgetIntでしたら、
第二引数にデフォルト値を設定することが可能です。

リファレンス↓
http://developer.android.com/intl/ja/reference/android/content/SharedPreferences.html


以上です。

--
高柳 翔
mail: sobac...@gmail.com
Twitter: sobachanko

2011年2月7日17:17 Kuchinashi <and...@k-score.net>:

--
このメールは Google グループのグループ「日本Androidの会」の登録者に送られています。
このグループに投稿するには、android-g...@googlegroups.com にメールを送信してください。
このグループから退会するには、android-group-j...@googlegroups.com にメールを送信してください。
詳細については、http://groups.google.com/group/android-group-japan?hl=ja からこのグループにアクセスしてください。



Kuchinashi

unread,
Feb 8, 2011, 1:54:50 AM2/8/11
to 日本Androidの会
yanagiさん

ご回答ありがとうございました.
素直にnullならdefaultValue値を取得するような方法は無いみたいですね.
getString等を使うと,設定項目が増えるたびにその部分のソース変更が必要になってくるので,以下のようにしてみました.
XMLの設定ファイルからデフォルト設定値を取得後,設定済み設定値を上書きしています.

もうちょっとスマートな書き方(処理)が有りましたら是非ご教授ください(汗

public static void loadSettings(Context context) {
SharedPreferences sp =
PreferenceManager.getDefaultSharedPreferences(context);
sp.edit().commit();
Map<String, ?> map = sp.getAll();
settings = new HashMap<String, String>();

// 設定項目
ArrayList<String> preference_map = new ArrayList<String>();
preference_map.add("CheckBoxPreference");
preference_map.add("EditTextPreference");
preference_map.add("ListPreference");

try {
XmlPullParser parser =
context.getResources().getXml(R.xml.application_settings);
try {

parser.setInput(context.getResources().openRawResource(R.xml.application_settings),
null);
} catch (Exception e) {
_Debug.e(context, e, "XMLPullParserException", e.getMessage());
}

int e = 0;
for(e = parser.getEventType(); e != XmlPullParser.END_DOCUMENT; e =
parser.next()) {

if(e == XmlPullParser.START_TAG) {
Log.d("XML:ELEM_NAME", parser.getName());
for(int i=0; i<preference_map.size(); i++) {
if(parser.getName().equals(preference_map.get(i))) {
String key = "", value = "";
for(int a = 0; a < parser.getAttributeCount(); a++) {
if(parser.getAttributeName(a).equals("key")) {
key = parser.getAttributeValue(a);
}
if(parser.getAttributeName(a).equals("defaultValue")) {
value = parser.getAttributeValue(a);
}
}
settings.put(key, value);
}
}
}
}
} catch (Exception e) {
_Debug.e(context, e, "XMLPullParserException", e.getMessage());
}

for(String key : map.keySet()) {
settings.put(key, map.get(key).toString());
}
}

On 2月7日, 午後6:49, yanagi <sobacha...@gmail.com> wrote:
> Kuchinashiさん
>
> 高柳と申します。
>
> SharedPreferencesに保存されている値は、基本的にはキー名が決まっているかと思いますので、
> SharedPreferences#getAllを使わずに、
> SharedPreferences#getStringなどを使われてはいかがでしょうか。
>
> 個別に取得するgetStringやgetIntでしたら、
> 第二引数にデフォルト値を設定することが可能です。
>
> リファレンス↓http://developer.android.com/intl/ja/reference/android/content/Shared...
>
> 以上です。
>
> --
> 高柳 翔
> mail: sobacha...@gmail.com
> Twitter: sobachanko
>
> 2011年2月7日17:17 Kuchinashi <andr...@k-score.net>:
Reply all
Reply to author
Forward
0 new messages