2010-03-16 30 views
26

Tôi có một preferences.xml trông như thế này:Làm cách nào để khai báo loại tùy chọn Android?

<?xml version="1.0" encoding="utf-8"?> 
<PreferenceScreen 
    xmlns:android="http://schemas.android.com/apk/res/android"> 
<EditTextPreference 
    android:name="Sample" 
    android:enabled="true" 
    android:persistent="true" 
    android:summary="Sample" 
    android:defaultValue="3.0" 
    android:title="Sample" 
    android:key="sample" /> 
</PreferenceScreen> 

Khi tôi làm sp.getString ("mẫu", "3.0"), nó hoạt động tốt và trả về một chuỗi, nhưng nó không phải là một chuỗi, nó phải là một phao. Chạy sp.getFloat ("sample", 3.0f) sẽ ném ra một ClassCastException vì nó là một chuỗi.

Tôi nên đặt gì trong XML để tùy chọn được lưu trữ dưới dạng phao?

Trả lời

10

Nếu bạn đang sử dụng API màn hình tùy chọn tích hợp thay vì viết tùy chọn Hộp thoại hoặc Hoạt động của riêng bạn, thì bạn sẽ bị giới hạn một chút ở một số khía cạnh. Ví dụ EditTextPreference sẽ luôn lưu giá trị dưới dạng String.

Từ the API Doc:

sở thích này sẽ lưu trữ một chuỗi vào SharedPreferences.

Tôi lưu ý rằng dường như không có cách nào để bạn hạn chế người dùng chỉ cần nhập số dấu phẩy động hợp lệ vào trường văn bản của bạn. Bạn sẽ làm gì nếu họ gõ "abc"?

4

Như mbaird đã chỉ ra, bạn không thể bắt buộc lưu trữ dưới dạng Float.

Nhưng bạn có thể thay đổi EditTextPreference thành chế độ xem đơn giản Preference và triển khai sự kiện click cho sự kiện đó. Bằng cách này, bạn sẽ có thể tạo và hiển thị Hộp thoại của riêng bạn, để chỉnh sửa giá trị, và do đó bạn có thể hạn chế định dạng và lưu dưới dạng Float vào tệp tùy chọn.

42

Trong tùy chọn của bạn xml, bạn có thể thêm tùy chọn android:numeric với giá trị "integer". Bằng cách này, người dùng chỉ có thể nhập giá trị số nguyên hợp lệ.

Khi tải các thiết lập mà bạn nên cố gắng phân tích nó để một số bản thân (như tất cả các giá trị được lưu trữ như Strings (@mbaird bên dưới)):

try { 
    float val = Float.parseFloat(sp.getString("sample", "3.0f")); 
} catch (NumberFormatException e) { 
    // "sample" was not an integer value 
    // You should probably start settings again 
} 
+0

công trình này. cảm ơn. – Gubatron

+3

Dường như hoạt động, mặc dù Eclipse không cung cấp Intellisense cho phần "android: numeric" ... do đó tôi sẽ không bao giờ nghĩ về điều đó, cảm ơn! – Select0r

+0

hoạt động tốt. Tôi không dựa vào đầu vào của người dùng, nhưng một danh sách đề cập đến chuỗi nổi. Rất dễ dàng để làm và dễ dàng để xử lý bắt. – Nlinscott

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