2010-09-15 38 views
49

Sử dụng đơn giản EditTextPreference trong hoạt động sở thích của tôi:PreferenceActivity: lưu giá trị là số nguyên

<EditTextPreference 
    android:key="SomeKey" 
    android:title="@string/some_title" 
    android:summary="..." 
    android:numeric="integer" 
    android:maxLength="2" 
/> 

Có cách nào mà giá trị cấu hình này sẽ được lưu lại dưới dạng số nguyên? Dường như bây giờ nó chỉ cho phép nhập số, nhưng giá trị vẫn còn lưu lại dưới dạng chuỗi:

Calling:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
int value = preferences.getInt("SomeKey", -1); 

ném tôi java.lang.ClassCastException: java.lang.String, và:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
String value = preferences.getString("SomeKey", "-1"); 

lấy giá trị thành công.

Cách tạo PreferenceActivity để lưu giá trị làm số nguyên theo mặc định?

Trả lời

58

Bạn có thể mở rộng EditTextPreference:

public class IntEditTextPreference extends EditTextPreference { 

    public IntEditTextPreference(Context context) { 
     super(context); 
    } 

    public IntEditTextPreference(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public IntEditTextPreference(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    @Override 
    protected String getPersistedString(String defaultReturnValue) { 
     return String.valueOf(getPersistedInt(-1)); 
    } 

    @Override 
    protected boolean persistString(String value) { 
     return persistInt(Integer.valueOf(value)); 
    } 
} 

Nó sẽ là tốt hơn để ghi đè lên onSetInitialValue() và setText() phương pháp, nhưng sau đó bạn sẽ phải sao chép một số mã từ một lớp cơ sở. Giải pháp trên đơn giản hơn, nhưng nó khá phức tạp - các phương thức "string" làm điều gì đó với int. Cố gắng không mở rộng lớp này hơn nữa ;-)

Bạn có thể sử dụng nó từ XML bằng cách:

<package.name.IntEditTextPreference 
    android:key="SomeKey" 
    android:title="@string/some_title" 
    android:summary="..." 
    android:numeric="integer" 
    android:maxLength="2" 
/> 
+0

@Brutall, tôi muốn cảm ơn bạn bằng cách cải thiện mã. Nhưng có người nói với tôi rằng mã mới là ... quá dài, và anh ta từ chối nó. Ồ, nhưng mọi người làm gì nếu mã cũ là xấu, và cần phải được thay thế, nhưng họ không làm điều đó bởi vì cái mới là ... dài? Ngay cả khi nó là tốt hơn. Ôi trời, thật tuyệt! Đây là nơi dành cho các lập trình viên? Tôi có một số dự án mã nguồn mở và tôi đang mở bất kỳ thay đổi nào đối với mã của mình. Làm thế nào xấu hổ với anh ta! Dù sao, cảm ơn bạn rất nhiều, Brutall. –

+0

Btw, tất cả những gì tôi làm là: đặt kiểu đầu vào thành số; thêm một 'TextWatcher', để đảm bảo rằng người dùng văn bản nhập vào không rỗng, và giá trị mặc định là' 0'. –

+3

im nhận được lỗi thời gian chạy trên 'return String.valueOf (getPersistedInt (-1));', không thể bắt đầu hoạt động do dòng đó – ibaguio

7

Ngay cả khi bạn đặt android: numeric = "integer", nó sẽ là tùy chọn văn bản - như tên gọi của nó. Bạn có thể dễ dàng chuyển đổi giá trị chuỗi thành int bằng cách sử dụng Integer.valueOf(). Ngoài ra, bạn có thể ghi đè PreferenceActivity để thực hiện chuyển đổi tự động khi thoát.


Tôi nghĩ giải pháp tốt nhất là viết phương pháp đơn giản để nhận giá trị này từ các tùy chọn. Một cái gì đó như:

public static int getSomePref(Context context) { 
    SharedPreferences prefs = 
     PreferenceManager.getDefaultSharedPreferences(context); 
    String value = prefs.getString("SomeKey", null); 
    return value == null ? -1 : Integer.valueOf(value); 
} 

Sau đó, bạn có thể dễ dàng sử dụng nó từ mã của bạn.

+0

Tôi có thể ghi đè điều này ở đâu?Theo mặc định 'PreferenceActivity' thực hiện việc lưu tự động, tôi có nên ghi đè lên một số phương thức để nhận giá trị hoặc tự lưu tất cả thay vào đó không? – Laimoncijus

+0

Ok, việc thay đổi loại tùy chọn không tốt, vì bạn có thể gặp sự cố ClassCastException. Tôi đã cập nhật câu trả lời của mình. – broot

+0

Vâng, tôi đã nghĩ về bản thân mình, nhưng phần nào tôi vẫn không thích giải pháp này ... 'SharedPreferences' có phương thức' getInt', vì vậy vẫn hy vọng bằng cách nào đó tìm cách làm thế nào để nói 'PreferenceActivity' để lưu giá trị như int - tất cả các chức năng là có ... chỉ cần không làm việc như whished ... – Laimoncijus

0

tôi đã có vấn đề tương tự. (Tôi muốn SharedPreference cung cấp cho tôi số cổng mà tôi đã lưu trữ trong tệp xml tùy chọn là defaultValue).

Việc triển khai tất cả các phương thức SharedPreferences sẽ là rất nhiều nỗ lực, vì vậy hãy viết một phương thức tùy chỉnh trong lớp instanced SharedPreferences, như là broot được đề xuất sẽ là tốt nhất tôi nghĩ.

Bạn có thể là tốt chỉ cần sử dụng phương pháp tĩnh của Integer trong dòng nơi bạn cần nó:

int number = Integer.valueOf(settings.getString("myNumberString", "0")); 
3

Mặc dù một câu trả lời đã được trỏ hướng chấp nhận Tôi muốn chia sẻ thêm một cách ngắn hơn để đạt được điều này:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 
int value = Integer.parseInt(preferences.getString("SomeKey", "-1")); 

Vì bạn đã đặt chỉ có thể nhập số này, không thông qua bất kỳ ngoại lệ nào. chưa hoàn thành câu trả lời của tôi:

<EditTextPref 
    android:key="SomeKey" 
    android:title="@string/some_title" 
    android:summary="..." 
    android:numeric="integer" 
    android:maxLength="2" /> 
Các vấn đề liên quan