2011-02-07 52 views
18

này được lái xe cho tôi hạt vì nó là điều mà tôi đã làm trước đó nhưng không thể tìm ra lý do tại sao nó không làm việc bây giờ ...Android Spinner - onItemSelected/setOnItemSelectedListener không kích hoạt

Tôi đã có một menu , được thực hiện theo cách thông thường thông qua tệp menu.xml và phương thức onOptionsItemSelected với công tắc trong đó, tạo và hiển thị một trình quay tròn.

Tôi đã thêm setOnItemSelectedListener, nhưng nó chưa bao giờ có vẻ kích hoạt. Spinner xuất hiện, tôi chọn một tùy chọn hoặc trả lại, không được gọi là onItemSelected hoặc onNothingSelected.

Đây là tất cả các mã giữa "trường hợp" và "trả về true" của câu lệnh chuyển đổi nút xử lý menu. (topThis là một biến đề cập đến bối cảnh hoạt động - hoạt động tốt cho tất cả các bánh nướng khác trong ứng dụng)

String[] widgetModes = {"Mode 1", "Mode2"}; 
ArrayAdapter<String> widgetModeAdapter = new ArrayAdapter<String> (this, android.R.layout.simple_spinner_item, widgetModes); 
widgetModeAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 

Spinner widgetModeSpinner = new Spinner(this); 
widgetModeSpinner.setAdapter(widgetModeAdapter); 
widgetModeSpinner.setPrompt("Choose Widget Mode"); 

widgetModeSpinner.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    { 
     Toast.makeText(topThis, "derp", Toast.LENGTH_LONG).show(); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) 
    { 
     Toast.makeText(topThis, "herf", Toast.LENGTH_LONG).show(); 
    } 
}); 

widgetModeSpinner.performClick(); 

Bất kỳ ý tưởng nào? Tôi mơ hồ nghi ngờ rằng thực tế tôi đang tạo ra Spinner lập trình là vấn đề ...

+0

có thể thử parentView.getContext()? Bạn không cần phải thêm nó ở đâu đó vào giao diện người dùng? - điều này có nghĩa là các sự kiện tương tác giao diện người dùng như chọn mục không được chuyển tới Spinner. – Jems

+1

Xin cảm ơn vì mẹo - đã kết thúc việc triển khai điều gì đó dọc theo các dòng đó. Thêm một spinner vô hình để bố trí, di chuyển tất cả mọi thứ ngoại trừ performClick ra khỏi phương thức trình đơn và vào một được gọi là onCreate. Dường như để đảm bảo rằng người nghe được "đính kèm" vào bố cục hiện đang tăng cao, hoặc một số như vậy. Vị trí của mã liên quan đến setContentView (R.layout.main); quan trọng là ... – Greg

+1

Tôi nghĩ thực tế là phần còn lại của mã của tôi liên quan đến việc lặp lại bố cục (sử dụng setContentView (R.layout.main);) cũng gây ra sự cố ... người nghe không còn được đính kèm nếu không được đặt lại sau khi bố cục reinflated. – Greg

Trả lời

6

Hãy nhớ rằng bạn không thể chọn lại cùng một mục spinner, nó luôn đặt mục đầu tiên được chọn nếu bạn không thêm một số mã tùy chỉnh để xử lý lựa chọn spinner.

Đối với Toast không hiển thị, tôi sẽ đề nghị luôn luôn sử dụng "MyActivity.this" như bối cảnh của bạn khi tạo Toast bên trong một giao diện người nghe như thế này:

spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { 
     /** 
     * Called when a new item is selected (in the Spinner) 
     */ 
     public void onItemSelected(AdapterView<?> parent, View view, 
        int pos, long id) { 
       // An spinnerItem was selected. You can retrieve the selected item using 
       // parent.getItemAtPosition(pos) 

       Toast.makeText(MyActivity.this, "Hello Toast",Toast.LENGTH_SHORT).show(); 

      } 

      public void onNothingSelected(AdapterView<?> parent) { 
       // Do nothing, just another required interface callback 
      } 

    }); // (optional) 

.show() ở cuối là dễ dàng để quên đôi khi;)

14

tôi đã có vấn đề tương tự khi tôi đã thực hiện một spinner, tôi giải quyết nó bằng cách phụ huynh Xem và thiết lập Adapter-

spinner1 =(Spinner)findViewById(R.id.spinner1); 
spinner1.setAdapter(BindSpinner("ProgramMaster",cols,null,true,"")); 
spinner1.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
protected Adapter initializedAdapter=null; 
    @Override 
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) 
    { 
     if(initializedAdapter !=parentView.getAdapter()) { 
      initializedAdapter = parentView.getAdapter(); 
      return; 
     } 

     String selected = parentView.getItemAtPosition(position).toString(); 

     if(abc.equals("Select") && !selected.equals("Select")) 
     { 
      do something 
     } 

     else 
     { 
      Do something 
     } 
     textQualification=selected; 
     SearchUpdated("Qualification"); 
    } 

    @Override 
    public void onNothingSelected(AdapterView<?> parentView) { 
     // your code here 
    } 
}); 
2

Tôi biết câu hỏi này hơi cũ, nhưng trong trường hợp bạn đang chờ một cuộc gọi lại AsyncTask, hãy đảm bảo rằng bạn cho bộ điều hợp biết các thay đổi dữ liệu bằng cách gọi notifyDataSetChanged() trên chuỗi gọi lại!

@Override 
public void onPostExecute(String result) { 
    ///do something with your data 
    spinnerArrayAdapter.notifyDataSetChanged(); 
} 
+0

Cảm ơn. Được đào trong 2 giờ cho điều này :) –

4

Trên thực tế, nếu tầm nhìn spinner của bạn được thiết lập để đi sau đó nó sẽ kích hoạt các nhấp chuột của nó khi bạn gọi performclick() phương pháp nhưng nó sẽ không kích hoạt setOnItemSelectedListener nó vì vậy bạn cần thay đổi mức độ hiển thị sau đó nó sẽ hoạt động

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