2010-04-19 13 views
12

Tôi có một ứng dụng, trong đó có một Spinner mà tôi muốn dân cư với một số con số (4,8,12,16). Tôi tạo ra một đối tượng số nguyên-mảng trong strings.xml với mặt hàng nêu trên, thiết lập các mục của Spinner đến số nguyên-mảng, và khi tôi chạy ứng dụng tôi nhận được:Spinner không thể tải một mảng số nguyên?

04-19 23:38:48.016: ERROR/AndroidRuntime(10193): java.lang.NullPointerException 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.ArrayAdapter.createViewFromResource(ArrayAdapter.java:355) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.ArrayAdapter.getView(ArrayAdapter.java:323) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.AbsSpinner.onMeasure(AbsSpinner.java:198) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:888) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:350) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.measureVertical(LinearLayout.java:464) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.LinearLayout.onMeasure(LinearLayout.java:278) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:2989) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.widget.FrameLayout.onMeasure(FrameLayout.java:245) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.View.measure(View.java:7965) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewRoot.performTraversals(ViewRoot.java:763) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.view.ViewRoot.handleMessage(ViewRoot.java:1632) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.os.Handler.dispatchMessage(Handler.java:99) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.os.Looper.loop(Looper.java:123) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at android.app.ActivityThread.main(ActivityThread.java:4310) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at java.lang.reflect.Method.invoke(Method.java:521) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) 
04-19 23:38:48.016: ERROR/AndroidRuntime(10193):  at dalvik.system.NativeStart.main(Native Method) 

Ngay sau khi tôi thay đổi mảng vào một mảng chuỗi, điều này hoạt động tốt. Điều này có bình thường không? Tôi nhận ra rằng tôi có thể (và sẽ) chỉ cần chuyển đổi các giá trị mảng chuỗi thành một int, nhưng nó có vẻ lạ mà tôi phải làm.

Cảm ơn!

EDIT: Bất kỳ ai? Có gì không?

+0

hmm, tôi nghĩ rằng điều này sẽ có/không có câu trả lời. – Adam

+0

Có cách nào để bạn có thể đăng một số mã không. Nó sẽ dễ dàng hơn để xem mã chứ không phải là một NPE chung. –

Trả lời

25

Điều bạn đang cố gắng thực hiện không được hỗ trợ.

Bạn rất có thể có một số mã mà trông như thế này:

ArrayAdapter adapter = ArrayAdapter.createFromResource(this, 
    R.array.numbers, android.R.layout.simple_spinner_item); 

Đó là tất nhiên gọi như sau:

/** 
* Creates a new ArrayAdapter from external resources. The content of the array 
* is obtained through {@link android.content.res.Resources#getTextArray(int)}. 
* 
* @param context The application's environment. 
* @param textArrayResId The identifier of the array to use as the data source. 
* @param textViewResId The identifier of the layout used to create views. 
* 
* @return An ArrayAdapter<CharSequence>. 
*/ 
public static ArrayAdapter<CharSequence> createFromResource(Context context, 
     int textArrayResId, int textViewResId) { 
    CharSequence[] strings = context.getResources().getTextArray(textArrayResId); 
    return new ArrayAdapter<CharSequence>(context, textViewResId, strings); 
} 

Các cuộc gọi đến getTextArray trả về một mảng với các đối tượng null chứ không phải là biểu diễn chuỗi các giá trị trong mảng số nguyên của bạn. Đào sâu hơn cho thấy nguồn gốc của vấn đề là trong một phương pháp AssetManager:

/** 
* Retrieve the text array associated with a particular resource 
* identifier. 
* @param id Resource id of the string array 
*/ 
/*package*/ final CharSequence[] getResourceTextArray(final int id) { 
    int[] rawInfoArray = getArrayStringInfo(id); 
    int rawInfoArrayLen = rawInfoArray.length; 
    final int infoArrayLen = rawInfoArrayLen/2; 
    int block; 
    int index; 
    CharSequence[] retArray = new CharSequence[infoArrayLen]; 
    for (int i = 0, j = 0; i < rawInfoArrayLen; i = i + 2, j++) { 
     block = rawInfoArray[i]; 
     index = rawInfoArray[i + 1]; 
     retArray[j] = index >= 0 ? mStringBlocks[block].get(index) : null; 
    } 
    return retArray; 
} 

Mã này giả định bạn đã cung cấp id tài nguyên của một mảng các chuỗi và do đó nó không thể đúng cách trích xuất ra các giá trị từ mảng lại số nguyên.

+1

cảm ơn lời giải thích rất sâu sắc – Adam

+0

Tôi cũng đánh giá cao sự giải thích. Tôi có cảm giác nó không được hỗ trợ, nhưng tôi không thể tìm ra lý do tại sao - bây giờ tôi có một cái. – Azoreo

+0

Cảm ơn bạn đã làm sáng tỏ. Tôi đã có cùng một vấn đề khi gán một mảng số nguyên cho một spinner trong một tập tin bố trí. – Hong

2

Để khắc phục vấn đề này, chỉ cần đặt dấu ngoặc kép quanh int của bạn đánh giá cao

<array name="spinner_value"> 
    <item>"18"</item> 
    <item>"8"</item> 
</array>