2012-09-13 14 views
5

私は、アクティビティではないクラスからgetSharedPreferencesを読み込んでプレイヤーにプレイリストを設定すると問題が発生します...私のアクティビティでは、オーディオファイルを扱うフォルダのパスを取得するためにedittextから文字列変数を受け取ります...Android以外のアクティビティgetSharedPreferences

public class MainActivity extends Activity { 


String ppp; 
@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    String PATH = getSharedPreferences("PATH", MODE_PRIVATE).getString("path", ppp); 
    if (PATH == null){ 
     .......... 
      ........... 
     path_tv.setText("folder is undefined"); 
    } 
    else { 
     path_tv.setText("folder defined: /mnt/sdcard/" + PATH); 
    } 
    set_path.setOnClickListener(new View.OnClickListener() { 

     @Override 
     public void onClick(View v) { 
      if (path_edit.getText().toString().length() == 0){ 
       Toast.makeText(getBaseContext(), "folder is undefined", Toast.LENGTH_SHORT).show(); 
      } 
      else { 
      ppp = path_edit.getText().toString(); 
      getSharedPreferences("PATH", MODE_PRIVATE) 
      .edit() 
      .putString("path", ppp) 
      .commit(); 
      File folder = new File(Environment.getExternalStorageDirectory() + "/" + ppp); 
      boolean success = false; 
      if (!folder.exists()) { 
       success = folder.mkdir(); 
       if (success) Toast.makeText(getBaseContext(), ".....", Toast.LENGTH_SHORT).show(); 
      } 
      String PATH = getSharedPreferences("PATH", MODE_PRIVATE).getString("path", ppp); 
      path_tv.setText("........ /mnt/sdcard/" + PATH); 
      path_edit.setText(""); 
      } 
     } 
    }); 

ので、...活動に私が変更することができ、共有設定で文字列の値を保存...しかしhoが、私は公共のクラスからそれを行うことができますか?すべての例を歓迎します...

答えて

8

として読み取りを行うなど、共有の好みの動作を記述するために、この コンテキストを使用する必要があります。これは汚れたハックですが、時にはそれほど役に立たないものはありません。

まずあなたはそう、あなたのアプリケーションクラスの静的メンバが必要になります。

public class MyApplication extends Application { 
    private static MyApplication instance; 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
     instance = this; 
    } 

    public static MyApplication getInstance() { 
     return instance; 
    } 
} 

あらゆるアクティビティを作成して実行して、アプリケーションの寿命を通して維持されている前に、Applicationオブジェクトが常に作成されているので、あなたはいつもあなたがすることを確認することができます適切なものを持っている。

あなたのコードでは、単にMyApplication.getInstance()を呼び出してください。あなたはグローバルなアプリケーションコンテキストを持っています。

MyApplicationをマニフェストで宣言することを忘れないでください。

+0

私は、MyAppをマニフェストに追加しました。また、extendsを持つクラスとして追加しました。今では私のクラスでは、AppApp.getInstance();を追加したコンストラクタを作成しました。 – timonvlad

+0

しかし、それでもnullpointexceptionを与えます....何が問題なのですか? – timonvlad

+0

スタックトレースを渡せますか?おそらく私の電子メールに載っています。私たちがあなたの問題を解決したら、あなたの質問や私の答えを編集できます。 私はこのようなソリューションを何度も使ってきました。 –

0

MainActivityを追加します。 getSharedPreferences

+0

を助けるために! !!! – timonvlad

1

前に、クラスのコンストラクタにコンテキストを渡した後、一つの方法は、Applicationオブジェクトを使用することです

  public class xyx{ 
      public xyx(Context context){ 
      this.context= context 
      } 

    Now use this context 
8

あなたのクラスメソッドに渡されたコンテキストを取得する必要があります。

MainActivity:

public class MainActivity extends Activity { 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     Test t = new Test("Show Preference: "); 
     getSharedPreferences("PATH", MODE_PRIVATE) 
     .edit() 
     .putString("p", "preference") 
     .commit(); 
     t.showToast(this.getApplicationContext()); 
    } 
} 

TestClassを:

public class Test { 
    private String s; 

    public Test(String s){ 
     this.s = s; 
    } 

    public void showToast (Context c){ 
     String pref = c.getSharedPreferences("PATH", Context.MODE_PRIVATE).getString("p", "Error"); 
     Toast.makeText(c.getApplicationContext(), s + pref, Toast.LENGTH_LONG).show(); 
    } 
} 

希望それは動作しません

関連する問題