2012-01-20 30 views
10

Tôi muốn kích hoạt sự kiện khi cùng một mục được chọn trong spinner. Phương phápsự kiện bắn tỉa spinner android khi lựa chọn mục giống nhau được thực hiện

@Override 
    public void onItemSelected(AdapterView<?> parent, View arg1, int position, 
      long arg3) { 
    } 

chỉ được gọi khi chúng tôi lựa chọn khác nhau được thực hiện. Mục đích của tôi là để hiển thị một bánh mì nướng khi bất kỳ mục nào được chọn hoặc cùng một mục được chọn lại hoặc lựa chọn khác nhau được thực hiện.

@Override 
    public void onNothingSelected(AdapterView<?> parent) { 

    } 

phương pháp trên không giải quyết được sự cố của tôi.

+0

Bản sao có thể có của [Làm cách nào để nhận sự kiện trong Android Spinner khi mục được chọn hiện tại được chọn lại?] (Http://stackoverflow.com/questions/5335306/how-can -i-get-an-sự kiện-trong-android-spinner-khi-hiện-được-chọn-mục-là-sele) –

Trả lời

0

sử dụng nhấp chuột nghe để đáp ứng yêu cầu của bạn. khi trình nghe nhấp chuột trực tiếp trên spinner không được hỗ trợ, do đó hãy tạo một lớp mở rộng spinner và hơn đi xe trên phương thức nhấp và trong phương pháp này làm những gì bạn muốn làm.

2

Bạn có thể thêm một tên phương pháp trên mục bạn chọn PHƯƠNG PHÁP

Spinner `Spinner1`=(Spinner)findViewById(R.id.`declareid`) 

đối tượng đã được công bố cho spinner

@Override 
     public void onItemSelected(AdapterView<?> parent, View arg1, int position, 
       long arg3) 
    { 
    ItemOnChange(); 
     } 

private void ItemOnChange() { 

     if(Spinner1.getSelectedItemPosition()>0){ 
     pd=ProgressDialog.show(this,"","Loading, Please wait .. ",true); 

      final int spinner=Spinner1.getSelectedItemPosition(); 


      final Handler ThreadCallback=new Handler(); 
      final Runnable runInCityThread=new Runnable(){ 
       public void run(){ 
        fnBindspimmer2(); 
        pd.dismiss(); 
       } 

      }; 

      new Thread(){ 
       @Override public void run(){ 

       Spinner2values(); 
       ThreadCallback.post(runInCityThread); 
       } 

      }.start(); 
     } 



} 
18

tôi đã nhận thấy rằng lựa chọn cũ được giữ ở biến được gọi là mOldSelectedPosition trong băng thông của spinner. Spinner đang sử dụng giá trị này để kiểm tra xem có cùng một mục được chọn hay không và nếu nó giống nhau, nó bỏ qua. Nếu chúng tôi không muốn bỏ qua điều này tôi đã làm là một số mã bẩn sử dụng sự phản chiếu.

package com.aradiom.amc.nativecomponents; 

import java.lang.reflect.Field; 

import android.content.Context; 
import android.util.Log; 
import android.widget.Spinner; 

public class SpinnerTrigger extends Spinner { 

public SpinnerTrigger(Context context) { 
    super(context); 
    // TODO Auto-generated constructor stub 
} 

@Override 
public void setSelection(int position, boolean animate) { 
    ignoreOldSelectionByReflection(); 
    super.setSelection(position, animate); 
} 

private void ignoreOldSelectionByReflection() { 
    try { 
     Class<?> c = this.getClass().getSuperclass().getSuperclass().getSuperclass(); 
     Field reqField = c.getDeclaredField("mOldSelectedPosition"); 
     reqField.setAccessible(true); 
     reqField.setInt(this, -1); 
    } catch (Exception e) { 
     Log.d("Exception Private", "ex", e); 
     // TODO: handle exception 
    } 
} 

@Override 
public void setSelection(int position) { 
    ignoreOldSelectionByReflection(); 
    super.setSelection(position); 
} 

} 

Lớp này sẽ luôn làm mất hiệu lực giá trị lựa chọn cũ, để mỗi khi sự kiện nhấp được kích hoạt. Nó có thể không phải là giải pháp hoàn hảo. Sử dụng cẩn thận. :)

+0

Giải pháp tuyệt vời! Tôi đã cố gắng để crack này một giờ. Cảm ơn! – nathanielwolf

+0

Tốt nhất. Cảm ơn bạn đã giải quyết được vấn đề của tôi. –

3

Vì danh tiếng của tôi không đủ cao để nhận xét trực tiếp về câu trả lời của @Suat, tôi đã thử phương pháp đó, nó hoạt động như sự quyến rũ, nhưng tôi không rõ tác dụng phụ có thể là gì. Điều tôi muốn thêm là, các nhà thầu bổ sung cần được thêm vào để tránh lỗi.

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

public SpinnerTrigger(Context context, AttributeSet attrs){ 
super(context,attrs); 

}

6

Hy vọng rằng sự giúp đỡ này. Tôi đã thử và hoạt động

/** Spinner extension that calls onItemSelected even when the selection is the same as its previous value */ 
    public class NDSpinner extends Spinner { 

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

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

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

     @Override public void 
     setSelection(int position, boolean animate) 
     { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position, animate); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
     } 
     } 

     @Override public void 
     setSelection(int position) 
     { 
     boolean sameSelected = position == getSelectedItemPosition(); 
     super.setSelection(position); 
     if (sameSelected) { 
      // Spinner does not call the OnItemSelectedListener if the same item is selected, so do it manually now 
      getOnItemSelectedListener().onItemSelected(this, getSelectedView(), position, getSelectedItemId()); 
     } 
     } 
    } 
+0

hoạt động như một nét duyên dáng trên 4.4.2 =) –

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