0

私のアプリには、共有設定を利用したいアクティビティがいくつかあります。最初に、各アクティビティで SharedPreferences を利用するメソッドを作成しましたが、これはうまく機能しました。ただ、同じデータを使うアクティビティが複数あるので、基本的に似たようなメソッドを複数箇所に挟んでいます。したがって、これらすべてのメソッドを処理する目的で特別にクラスを作成する方が理にかなっているように思えました。

残念ながら、私はそれを正しく行う方法を理解していません。

「getSharedPreferences は AppPrefs 型に対して未定義です」と表示されるため、これはコンパイルされません。</p>

public class AppPrefs {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

最後に、おそらく SharedPreferences はインターフェイスなので、これを行うことができますが、継承されたメソッドを実装する必要があると思いました。これらのメソッドをオーバーライドする理由はないので、これを行う理由もありません。

public class AppPrefs implements SharedPreferences {
 public void foo() {
  SharedPreferences settings = getSharedPreferences("MyAppPrefs", 0);
 } 
}

ここで何をするのが理にかなっていますか?私が見逃している概念はありますか?誰か詳しく説明してもらえますか?ありがとう。

4

2 に答える 2

1

設定がアプリケーションに対してグローバルである場合はPreferenceManager.getDefaultSharedPreferences();、共通の設定にアクセスする必要があるときに使用できます。設定が のサブセットに固有のものであるActivities場合は、いくつかの異なるオプションがあります。

Activity設定にアクセスする必要があるすべてのクラスによって拡張されるサブクラスを作成できます。

public abstract class AbstractFooActivity extends Activity
{
    protected SharedPreferences getFooPreferences()
    {
        return getSharedPreferences(PREFS_NAME, MODE_PRIVATE);
    }

    private static final String PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends AbstractFooActivity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getFooPreferences();
    }
}

または、私のように、クラス階層を台無しにしたくない場合は、設定にアクセスする必要があるアクティビティのグループに共通の定数値を作成するだけです。Activityこれは、設定にアクセスする必要がある階層の外部にクラスがある場合に役立ちます。たとえば、Service.

public final class FooConstants
{
    public static final String FOO_PREFS_NAME = "FooPrefs";
}

public class AFooActivity extends Activity
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

public class AFooService extends Service
{
    public void aMethodThatNeedsPrefs()
    {
        // ...
        SharedPreferences myPrefs = getSharedPreferences(FOO_PREFS_NAME, MODE_PRIVATE);
    }
}

2 番目の方法は、カプセル化がやや劣りますが、オブジェクト階層に対する制限が少なく、これは良いトレードオフだと思います。

于 2010-10-26T14:07:11.260 に答える
1

コンテキストを設定ゲッターに渡します。

public class AppPrefs {
 public static void foo(Context ctx) {
  SharedPreferences settings = ctx.getSharedPreferences("MyAppPrefs", 0);
 } 
}

アクティビティthisクラスからfoo()

于 2010-10-26T18:57:38.897 に答える