34

SharedPreferences として保存されている情報があります。アクティビティの外部から (ドメイン モデル クラスから) その情報にアクセスする必要があります。そのため、共有設定を取得するためだけに使用するアクティビティに静的メソッドを作成しました。

どうやら静的メソッドからメソッド「getSharedPreferences」を呼び出すことができないため、これによりいくつかの問題が発生しています。

日食が私に与えているメッセージは次のとおりです。

Cannot make a static reference to the non-static method 
getSharedPreferences(String, int) from the type ContextWrapper

次のように、Activity インスタンスを使用してこれを回避しようとしました。

public static SharedPreferences getSharedPreferences () {
  Activity act = new Activity();
  return act.getSharedPreferences("FILE", 0);
}

このコードはヌル ポイント例外を発生させます。

回避策はありますか? これをやろうとして、アンドロイドコードの匂いがしますか?

前もって感謝します。

4

6 に答える 6

67

クリスティアンの答えは良いですが、どこからでも共有設定にアクセスできるようにしたい場合、正しい方法は次のとおりです。

  1. のサブクラスを作成しますApplication。たとえばpublic class MyApp extends Application {...
  2. android:nameAndroidManifest.xml でタグの属性を設定して<application>、たとえば、新しいクラスを指すようにしますandroid:name="MyApp"(クラスが Android によって認識されるようにします) 。
  3. アプリ インスタンスの onCreate() メソッドで、コンテキスト (例: this) を という名前の静的フィールドに保存しapp、このフィールドを返す静的メソッド (例: ) を作成しますgetApp()。後でこのメソッドを使用して、アプリケーションのコンテキストを取得し、共有設定を取得できます。:-)
于 2010-09-27T17:14:29.197 に答える
36

これactは、この場合、作成したばかりのオブジェクトだからです。Android にそれを任せる必要があります。、( 、および他のクラスは から拡張されます)getSharedPreferences()のメソッドです。したがって、選択を行う必要があります。ContextActivityServiceContext

  • メソッドがアクティビティまたは他の種類のコンテキスト内にある場合:

    getApplicationContext().getSharedPreferences("foo", 0);
    
  • メソッドがアクティビティまたはその他の種類のコンテキストの外部にある場合:

    // you have to pass the context to it. In your case:
    // this is inside a public class
    public static SharedPreferences getSharedPreferences (Context ctxt) {
       return ctxt.getSharedPreferences("FILE", 0);
    }
    
    // and, this is in your activity
    YourClass.this.getSharedPreferences(YourClass.this.getApplicationContext());
    
于 2010-09-27T17:08:28.910 に答える