2012-09-13 42 views
5

Tôi gặp vấn đề khi đọc getSharedPreferences từ lớp không hoạt động để đặt danh sách phát trong trình phát ... Trong hoạt động của tôi, tôi lấy biến chuỗi từ edittext để lấy đường dẫn thư mục để làm việc với tệp âm thanh ...Android không hoạt động 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(""); 
      } 
     } 
    }); 

Vì vậy, trong hoạt động, tôi có thể thay đổi và lưu giá trị của chuỗi trong tùy chọn chia sẻ ... Nhưng tôi có thể làm điều đó từ lớp công cộng ...? Đánh giá cao bất kỳ ví dụ nào ...

Trả lời

8

Một cách là sử dụng Application đối tượng . Đây là một hack bẩn nhưng không ai ít hữu ích hơn.

Trước tiên, bạn cần một thành viên tĩnh trong lớp ứng dụng của bạn, vì vậy:

public class MyApplication extends Application { 
    private static MyApplication instance; 

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

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

Kể từ khi đối tượng Application luôn tạo ra trước khi bất kỳ hoạt động được tạo ra và chạy và được giữ suốt ứng dụng đời bạn luôn có thể chắc chắn bạn sẽ có một cái thích hợp.

Sau đó, trong mã của bạn chỉ cần gọi MyApplication.getInstance() và bạn sẽ có ngữ cảnh ứng dụng toàn cầu.

Hãy nhớ khai báo MyApplication trong tệp kê khai.

+0

Ok, tôi đã thêm MyApp vào tệp kê khai và là một lớp có mở rộng ... Bây giờ trong lớp của tôi, tôi đã tạo ra hàm tạo, trong đó thêm AppApp.getInstance(); – timonvlad

+0

Nhưng nó vẫn mang lại nhận thức không xác định .... vấn đề là gì? – timonvlad

+0

Bạn có thể cung cấp dấu vết ngăn xếp không? có thể trên email của tôi - khi chúng tôi giải quyết vấn đề của bạn, chúng tôi có thể chỉnh sửa câu hỏi của bạn hoặc câu trả lời của tôi. Tôi đã sử dụng giải pháp như thế này nhiều lần. –

0

thêm MainActivity.this. trước getSharedPreferences

+0

Nó không làm việc! !!! – timonvlad

1

bạn cần phải vượt qua bối cảnh trong constructor của lớp và sau đó sử dụng bối cảnh này để thực hiện đọc hoặc viết hoạt động ưu tiên cổ phiếu như là

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

    Now use this context 
8

Bạn đã để bối cảnh truyền cho phương pháp lớp học của bạn:

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

Hope để giúp

Các vấn đề liên quan