web-dev-qa-db-ja.com

Android StudioでgetSharedPreferencesを実装しようとすると「メソッドを解決できません」というエラーが表示される

SharedPreferencesとやり取りするためのメソッドを格納するクラスKeyValueDBを作成しようとしていますが、クラスを定義するだけで問題が発生します。コンストラクタで実行するのは、正しいファイル名でsharedPreferencesオブジェクトを保存することだけですが、「getSharedPreferences(Java.lang.String、int)メソッドを解決できません」というメッセージが表示されます。

Stringとintを渡しています...何が間違っているのかわかりません。ヘルプを感謝します!

package com.farmsoft.lunchguru.utils;

import Android.content.Context;
import Android.content.SharedPreferences;

import Java.util.ArrayList;
import Java.util.List;
import Java.util.Map;

import org.json.JSONException;

/**
 * Created by sxs on 4/28/2014.
 */
public class KeyValueDB {
    private SharedPreferences sharedPreferences;

    public KeyValueDB(String prefName) {
        sharedPreferences = getSharedPreferences(prefName, Context.MODE_PRIVATE);
    }
12
Scott

getSharedPreferences()にアクセスするにはコンテキストが必要です。

例えば:

mContext.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);

コンテキストをKeyValueDBのコンストラクターに渡すか、より良い方法は静的にアクセスすることです。

こうする

public class KeyValueDB {
private SharedPreferences sharedPreferences;
private static String PREF_NAME = "prefs";

    public KeyValueDB() {
    // Blank
    }

    private static SharedPreferences getPrefs(Context context) {
        return context.getSharedPreferences(PREF_NAME, Context.MODE_PRIVATE);
    }

    public static String getUsername(Context context) {
        return getPrefs(context).getString("username_key", "default_username");
    }

    public static void setUsername(Context context, String input) {
        SharedPreferences.Editor editor = getPrefs(context).edit();
    editor.putString("username_key", input);
    editor.commit();
    }
}

保存する必要のある情報について、これらのgetメソッドとsetメソッドを繰り返すだけです。

アクティビティからそれらにアクセスするには、次のようにします。

String username = KeyValueDB.getUsername(this);

「this」はアクティビティへの参照です。次のように、onCreate()メソッドの各アクティビティにコンテキストを設定することもお勧めします。

public class myActivity extends Activity{

Context mContext;

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mContext = this;

    String username = KeyValueDB.getUsername(mContext);
}

2016年7月編集

以下の@RishirajPurohitへの応答として、ユーザー名を設定するには、ほぼ同じことを行います。

KeyValueDB.setUsername(mContext, "DesiredUsername");

そこから、以前の静的クラスですべてが行われ、変更は共有設定ファイルにコミットされ、永続化され、getメソッドで取得できる状態になります。

誰かが不思議に思った場合に備えて、getメソッドに注意してください。

public static String getUsername(Context context) {
    return getPrefs(context).getString("username_key", "default_username");
}

「default_username」は、まさにそのとおりです。ユーザー名が設定される前にそのgetメソッドが最初に呼び出された場合、それが返される値です。この例ではあまり有用ではありませんが、整数とブール値の使用を開始するとき、これは堅牢性を確保するのに非常に役立ちます。

36
MattBoothDev

そこにコンテキストを渡す必要があります...

文字列値を取得する例:

public static String getUserName(Context ctx)
{
    return getSharedPreferences(ctx).getString(PREF_USER_NAME, "");
}

どこ PREF_USER_NAMEがキーであり、2番目のパラメーターは、返すキーが見つからないときに""

1
Rod_Algonquin