2009-10-19 36 views
42

Tôi tuyên bố Spinner của tôi theo cách sau đây (nó rất tĩnh vì vậy tôi có 2 mảng chuỗi trong array.xml cho tiêu đề và giá trị)Android - cấu hình Spinner sử dụng mảng

<Spinner android:id="@+id/searchCriteria" android:entries="@array/ 
searchBy" android:entryValues="@array/searchByValues"> 
</Spinner> 

Tôi hy vọng spinner.getSelectedItem() để trả lại một mảng [title, value] nhưng thực tế nó chỉ trả về một chuỗi tiêu đề. Có phải nó bỏ qua android:entryValues? Làm thế nào để có được một giá trị, không phải là một tiêu đề từ nó? Có phải chỉ có thể thực hiện được với XML này hay tôi cần tạo bộ điều hợp và làm điều đó theo chương trình?

+1

ngay cả khi nó không hoạt động ... tôi thích sự đơn giản của ý nghĩ rằng – kritzikratzi

Trả lời

110

Thay vì phương pháp mảng kép, lý do tại sao không điền vào ArrayAdapter của bạn lập trình với các đối tượng của một kiểu đã biết và sử dụng nó. Tôi đã viết một hướng dẫn về bản chất tương tự (liên kết ở phía dưới) thực hiện điều này. Tiền đề cơ bản là tạo một mảng các đối tượng Java, báo cho trình quay số về và sau đó sử dụng các đối tượng đó trực tiếp từ lớp spinner. Trong ví dụ của tôi, tôi có một đối tượng đại diện cho một "Nhà nước" được quy định như sau:

package com.katr.spinnerdemo; 

public class State { 

// Okay, full acknowledgment that public members are not a good idea, however 
// this is a Spinner demo not an exercise in java best practices. 
public int id = 0; 
public String name = ""; 
public String abbrev = ""; 

// A simple constructor for populating our member variables for this tutorial. 
public State(int _id, String _name, String _abbrev) 
{ 
    id = _id; 
    name = _name; 
    abbrev = _abbrev; 
} 

// The toString method is extremely important to making this class work with a Spinner 
// (or ListView) object because this is the method called when it is trying to represent 
// this object within the control. If you do not have a toString() method, you WILL 
// get an exception. 
public String toString() 
{ 
    return(name + " (" + abbrev + ")"); 
} 
} 

Sau đó, bạn có thể cư một spinner với một mảng của các lớp này như sau:

 // Step 1: Locate our spinner control and save it to the class for convenience 
    //   You could get it every time, I'm just being lazy... :-) 
    spinner = (Spinner)this.findViewById(R.id.Spinner01); 

    // Step 2: Create and fill an ArrayAdapter with a bunch of "State" objects 
    ArrayAdapter spinnerArrayAdapter = new ArrayAdapter(this, 
      android.R.layout.simple_spinner_item, new State[] { 
       new State(1, "Minnesota", "MN"), 
       new State(99, "Wisconsin", "WI"), 
       new State(53, "Utah", "UT"), 
       new State(153, "Texas", "TX") 
       }); 

    // Step 3: Tell the spinner about our adapter 
    spinner.setAdapter(spinnerArrayAdapter); 

Bạn có thể lấy mục được chọn như sau:

State st = (State)spinner.getSelectedItem(); 

Và bây giờ bạn có một lớp Java phù hợp để làm việc. Nếu bạn muốn chặn khi giá trị spinner thay đổi, chỉ cần triển khai OnItemSelectedListener và thêm các phương thức thích hợp để xử lý các sự kiện.

public void onItemSelected(AdapterView<?> parent, View view, int position, long id) 
{ 
    // Get the currently selected State object from the spinner 
    State st = (State)spinner.getSelectedItem(); 

    // Now do something with it. 
} 

public void onNothingSelected(AdapterView<?> parent) 
{ 
} 

Bạn có thể tìm thấy toàn bộ hướng dẫn ở đây: http://www.katr.com/article_android_spinner01.php

+0

String toString() là khóa ở đây, nếu không nó sẽ hiển thị tên tài nguyên khi chọn spinner – adadion

+0

vậy, làm cách nào để đặt giá trị mặc định trong chương trình? –

7

Hủy bỏ, hủy bỏ! Tôi không biết điều gì đã xảy ra với tôi nhưng Spinner không hỗ trợ thuộc tính android:entryValues. Đó là một thực tế từ ListPreference mà làm một điều tương tự (hiển thị danh sách các mục trong hộp thoại bật lên). Đối với những gì tôi cần, tôi sẽ phải (than ôi) sử dụng SpinnerAdapter

+1

Bạn sẽ được muốn:> android: mục = "@ array/searchByValues ​​" – Blundell

54

Vì vậy, nếu bạn đến đây bởi vì bạn muốn có cả nhãn và giá trị trong Spinner - đây là cách tôi đã làm nó:

  1. Chỉ cần tạo Spinner của bạn theo cách thông thường
  2. Xác định 2 mảng kích thước bằng nhau trong tệp array.xml của bạn. Một cho nhãn, một cho giá trị
  3. Đặt Spinner của bạn với android:entries="@array/labels"
  4. Trong mã của bạn - khi bạn cần một giá trị làm điều gì đó như thế này (không có bạn không cần phải xích nó)

    String selectedVal = getResources().getStringArray(R.array.values)[spinner 
             .getSelectedItemPosition()]; 
    

  5. và hãy nhớ - những 2 mảng phải phù hợp với nhau như xa như khe số lượng và vị trí
+3

Các mảng song song đang la hét cho Bản đồ thay thế. – m0skit0

+0

müskitü: Tôi hoàn toàn đồng ý với bạn, nhưng tôi nghĩ Android khiến việc sử dụng Maps trở nên khó khăn. –

+2

thì điểm của thuộc tính "entryValues" khi xác định listView qua XML là gì? – sports

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