2012-09-13 146 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(""); 
      } 
     } 
    }); 

所以,在活動我可以改變並保存在共享偏好字符串的值...但是浩我能做到這一點從公共類...?欣賞任何例子...

回答

8

的一種方法是使用Application對象。這是一種骯髒的黑客攻擊,但有時候幫助不大。

首先你需要一個靜態成員在你的應用程序類,所以:

public class MyApplication extends Application { 
    private static MyApplication instance; 

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

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

由於創建和運行任何活動之前,申請對象總是創建並保持整個應用程序生命週期,你總是可以肯定你會有適當的一個。

然後在您的代碼中只需調用MyApplication.getInstance(),您將擁有全局應用上下文。

請記得在清單中聲明MyApplication

+0

好吧,我已經添加了MyApp到manifest,並且作爲一個擴展的類...現在在我的類中創建了構造函數,其中添加了AppApp.getInstance(); – timonvlad

+0

但它仍然給nullpointexception ....有什麼問題? – timonvlad

+0

你可以給堆棧跟蹤嗎?可能在我的電子郵件中 ​​- 當我們解決您的問題時,我們可以編輯您的問題或我的答案。 我一直在使用這樣的解決方案多次。 –

0

add MainActivity.this。前getSharedPreferences

+0

它不工作! ! – timonvlad

1

你需要通過上下文在類的構造函數,然後使用這個 背景下進行讀取或寫入共享偏好的操作等作爲

  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(); 
    } 
} 

希望能幫到