문제

선택한 항목이 변경 될 때 스피너의 이벤트 리스너를 어떻게 설정할 수 있습니까?

기본적으로 내가하려는 것은 다음과 비슷한 것입니다.

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}
도움이 되었습니까?

해결책

이전 답변 중 일부는 정확하지 않습니다. 그들은 다른 위젯과 뷰에서 작동하지만 스피너 위젯 명확하게 설명 :

스피너는 항목 클릭 이벤트를 지원하지 않습니다. 이 방법을 호출하면 예외가 발생합니다.

더 나은 사용 onitemselectedListener () 대신에:

spinner.setOnItemSelectedListener(new OnItemSelectedListener() {
    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

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

});

이것은 나를 위해 작동합니다.

뷰가 빌드 될 때 onitemselected 메소드도 호출되므로 내부에 넣는 것을 고려할 수 있습니다. onCreate() 방법 호출.

다른 팁

Spinner spnLocale = (Spinner)findViewById(R.id.spnLocale);

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
        // Your code here
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

메모: 한 가지를 기억하십시오.

스피너 OnItemSelectedListener 이벤트는 두 번 실행됩니다.

  1. 스피너 초기화
  2. 수동으로 선택한 사용자

플래그 변수를 사용하여 두 가지를 구별하십시오.

당신은 구현할 수 있습니다 AdapterView.OnItemSelectedListener 당신의 활동에서 수업.

그런 다음 아래 줄을 사용하십시오 onCreate()

Spinner spin = (Spinner) findViewById(R.id.spinner);
spin.setOnItemSelectedListener(this);

그런 다음이 두 가지 방법을 무시합니다.

public void onItemSelected(AdapterView<?> parent, View v, int position, long id) {
    selection.setText(items[position]);
}

public void onNothingSelected(AdapterView<?> parent) {
    selection.setText("");
}

https://stackoverflow.com/q/1714426/811625

간단한 점검으로 onitemelectedListener ()가 호출되는 것을 피할 수 있습니다. 현재 선택 지수를 정수 변수에 저장하고 onitemSelected (..) 내에 확인하십시오.

예 :

Spinner spnLocale;

spnLocale = (Spinner)findViewById(R.id.spnLocale);

int iCurrentSelection = spnLocale.getSelectedItemPosition();

spnLocale.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
    public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) { 
    if (iCurrentSelection != i){
            // Your code here
    }
    iCurrentSelection = i;
    } 

    public void onNothingSelected(AdapterView<?> adapterView) {
        return;
    } 
}); 

원인의 iCurrentSelection 이것이 작동하기 위해 객체 범위에 있어야합니다!

스피너 이름을 찾고 ID를 찾은 다음이 메소드를 구현하십시오.

spinnername.setOnItemSelectedListener(new OnItemSelectedListener() {

    @Override
    public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
        // your code here
    }

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

스피너-윌젯의 문서는 말합니다

스피너는 항목 클릭 이벤트를 지원하지 않습니다.

당신은 사용해야합니다 setOnItemSelectedListener 문제를 처리합니다.

OnitemSelectedListener를 OnCreate 또는 OnStart로 설정하는 것은 중요하지 않습니다. 활동 생성 또는 시작 중에도 여전히 호출됩니다 (각각).
그래서 우리는 그것을 OnCreate로 설정할 수 있습니다 (그리고 OnStart에 있지 않습니다!).
첫 번째 초기화를 파악하려면 플래그를 추가하십시오.

private Spinner mSpinner;
private boolean mSpinnerInitialized;

그런 다음 OnCreate (또는 OnCreateView)에서만 :

mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            public void onItemSelected(AdapterView<?> adapterView, View view, int i, long l) {
                if (!mSpinnerInitialized) {
                    mSpinnerInitialized = true;
                    return;
                }

                // do stuff
            }

            public void onNothingSelected(AdapterView<?> adapterView) {
                return;
            }
        });
spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);

진정한 onchangedListener ()를 원한다면. 핸들러에 초기 값을 저장하고 변경되었는지 확인하십시오. 간단하고 그렇습니다 ~ 아니다 글로벌 변수가 필요합니다. 페이지에 둘 이상의 스피너가있는 경우 작동합니다.

String initialValue = // get from Database or your object
mySpinner.setOnItemSelectedListener(new SpinnerSelectedListener(initialValue));

...

protected class SpinnerSelectedListener implements AdapterView.OnItemSelectedListener {

        private SpinnerSelectedListener() {
            super();
        }

        public SpinnerSelectedListener(String initialValue) {
            this();
            this.initialValue = initialValue;
        }

        private String initialValue;

        // getter and setter removed.  

        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            final String newValue = (String) spinHeight.getItemAtPosition(position);
            if (newValue.equals(initialValue) == false) {
               // Add your code here.  The spinner has changed value. 

               // Maybe useful.   
               // initialValue = newValue;
            }

        }

        @Override
        public void onNothingSelected(AdapterView<?> parent) {
               // Maybe useful.   
               // initialValue = null; 
        }
    }

물건은 당신의 친구입니다.

spinner.setOnItemSelectedListener(
            new AdapterView.OnItemSelectedListener() {

                @Override
                public void onItemSelected(AdapterView<?> arg0, View arg1,
                        int arg2, long arg3) {

                    // TODO Auto-generated method stub
                }

                @Override
                public void onNothingSelected(AdapterView<?> arg0) {
                    // TODO Auto-generated method stub

                }
                //add some code here
            }
        );

현재 스피너 선택에 대한 글로벌 변수를 사용하십시오.

int currentItem = 0;

spinner_counter = (Spinner)findViewById(R.id.spinner_counter);
String[] value={"20","40","60","80","100","All"};
aa=new ArrayAdapter<String>(this,R.layout.spinner_item_profile,value);
aa.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
spinner_counter.setAdapter(aa);

spinner_counter.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
            if(currentItem == position){
                return; //do nothing
            }
            else
            {
                 TextView spinner_item_text = (TextView) view;
                 //write your code here
            }
            currentItem = position;
        }

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

        }
    });

//R.layout.spinner_item_profile
<?xml version="1.0" encoding="utf-8"?>

<TextView  android:id="@+id/spinner_item_text"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent" 
android:layout_height="wrap_content"
android:background="@drawable/border_close_profile"
android:gravity="start"  
android:textColor="@color/black"         
android:paddingLeft="5dip"
android:paddingStart="5dip"
android:paddingTop="12dip"
android:paddingBottom="12dip"
/>

//drawable/border_close_profile
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
  <item>
   <shape android:shape="rectangle">
    <solid android:color="#e2e3d7" />
   </shape>
 </item>
<item android:left="1dp"
android:right="1dp"
android:top="1dp"
android:bottom="1dp">
<shape android:shape="rectangle">
    <solid android:color="@color/white_text" />
</shape>
</item>
</layer-list>

이것은 스피너와 findViewById를 자세히 설명하고 이것을 사용합니다.

    Spinner schemeStatusSpinner;

  schemeStatusSpinner = (Spinner) dialog.findViewById(R.id.spinner);

schemeStatusSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
        @Override
        public void onItemSelected(AdapterView<?> parentView, View selectedItemView, int position, long id) {
            // your code here
            if(schemeStatusSpinner.getSelectedItemId()==4){
                reasonll.setVisibility(View.VISIBLE);
            }
            else {
                reasonll.setVisibility(View.GONE);
            }
        }

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

    });

내가 생각하는 가장 좋은 방법은 flagitemselected = 0; 안에 onCreate(). 그리고 항목에서 선택한 이벤트 증분에서 그 플래그를 촉진합니다 flagitemselected++; 그런 다음 확인하십시오

if(flagitemselected!=1)
{
// do your work here
}

이것은 내가 추측하는 데 도움이 될 것입니다.

내가 찾은 한 가지 트릭은 setonitemselectedListeners를 OnCreate 대신 onwindowfocuschanged에 넣는 것이 었습니다. 나는 아직 이런 식으로 그렇게하는 나쁜 부작용을 찾지 못했습니다. 기본적으로 창문이 그려진 후 청취자를 설정하십시오. WindowFocusCuschanged 실행이 얼마나 자주 있는지 잘 모르겠지만 너무 자주 실행되는 경우 잠금 변수를 만들 수 있습니다.

Android가 메시지 기반 처리 시스템을 사용하고 있다고 생각하며, 모든 것을 OnCreate에 넣으면 스피너가 채워진 후에 채워진 상황에 빠질 수 있습니다. 따라서 항목 위치를 설정 한 후 청취자가 발사됩니다. 물론 이것은 교육받은 추측이지만, 이것에 대해 자유롭게 수정하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top