2012-03-13 28 views
33

Tôi đã tạo hình nền động trên Android và tôi đang cố gắng cho phép người dùng chọn hình ảnh từ điện thoại của họ và áp dụng nó làm hình nền, nhưng khi tôi khởi chạy hoạt động bắt đầu ý định chọn hình ảnh, tùy chọn được chia sẻ của tôi dường như không lưu đúng cách.Tùy chọn chia sẻ trên Android không lưu

Dưới đây là phương pháp onCreate của hoạt động tôi bắt đầu khi người dùng nhấn nút tùy chọn và onActivityResult nhận đường dẫn của hình ảnh trên thiết bị (tất cả những gì dường như hoạt động). Các println sau khi tôi cam kết các ưu đãi in ra không có gì.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

    Intent photoPickerIntent = new Intent(Intent.ACTION_PICK); 
    photoPickerIntent.setType("image/*"); 
    startActivityForResult(photoPickerIntent, SELECT_PICTURE); 
} 

@Override 
public void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 

    if (resultCode == RESULT_OK) { 
     if (requestCode == SELECT_PICTURE) { 
      Uri selectedImageUri = data.getData(); 
      selectedImagePath = getPath(selectedImageUri); 

      preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0); 
      preferences.edit().putString(SETTINGS_BACKGROUND_IMAGE, "okok"); 
      preferences.edit().commit(); 

      System.out.println("Image" + preferences.getString(SETTINGS_BACKGROUND_IMAGE, "")); 
     } 
    } 

    finish(); 
} 

Trả lời

76

Từ documentation:

Tạo một biên tập mới cho những sở thích, thông qua đó bạn có thể làm cho sửa đổi dữ liệu trong các ưu đãi và nguyên tử cam kết những thay đổi đó lại phản đối các SharedPreferences.

Kể từ đó là một trường hợp biên tập mới, mã của bạn nên được nhiều như thế này:

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok"); 
editor.commit(); 
+16

Tôi có phải là người duy nhất không thể thấy sự khác biệt trong logic giữa mã này và mã gốc không? – josephus

+35

khi bạn gọi preferences.edit(), bạn nhận được một cá thể Editor, trên đó jOE đã đặt một chuỗi, nhưng sau đó, cá thể đó không còn được sử dụng (do đó bị mất và có thể thu gom rác). Sau đó, jOE gọi là preferences.edit() một lần nữa, nhận một cá thể Editor khác có chứa các thiết lập ban đầu, mà anh ta vừa lưu tại chỗ. Điều này về cơ bản chỉ cần lưu các thiết lập ban đầu (không làm gì để cập nhật sở thích chia sẻ của mình) – zrgiu

+1

zrgui, cảm ơn bạn rất nhiều vì đã giúp đỡ của bạn! Đề xuất của bạn đã hoạt động hoàn hảo! – jOE

13

Hãy thử một cách khác để khởi SharedPreferences bạn biến:

SharedPreferences sf = PreferenceManager.getDefaultSharedPreferences(this); 

Bạn cũng có thể chuỗi văn bản cho sf với sf.edit().putString(string, value).commit();

+1

Tôi không muốn xích nó nữa. –

+4

Tôi không phải là người chơi Tôi chỉ cần chuỗi rất nhiều ... –

1

Trong trường hợp của tôi, tôi phải thêm editor.apply(); trước khi cam kết để làm việc.

Đây là mã của tôi:

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok"); 
editor.apply();//I added this line and started to work... 
editor.commit(); 
+2

áp dụng là để lưu dữ liệu một-synchronically trong khi cam kết là để lưu nó ngay lập tức, bạn không nên sử dụng chúng cả hai !!! – XcodeNOOB

0

tốt, dựa trên bài @zrgiu, đối với tôi chỉ làm việc thêm editor.clear(); trước khi sử dụng các biên tập viên ... do đó, mã cuối cùng sẽ được một cái gì đó như:

preferences = getApplicationContext().getSharedPreferences(PREFERENCES_NAME, 0); 
SharedPreferences.Editor editor = preferences.edit(); 
editor.clear(); 
editor.putString(SETTINGS_BACKGROUND_IMAGE, "okok"); 
editor.commit(); 

;)

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