커스텀 - Android Spinner:선택한 항목 변경 이벤트 가져 오기




안드로이드 커스텀 스피너 (10)

선택한 항목이 변경되면 Spinner에 대한 이벤트 리스너를 어떻게 설정할 수 있습니까?

기본적으로 내가하려고하는 것은 이것과 비슷한 것이다 :

spinner1.onSelectionChange = handleSelectionChange;

void handleSelectionChange(Object sender){
    //handle event
}

Activity에 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("");
}

onCreate 또는 onStart에서 OnItemSelectedListener를 설정하면 문제가되지 않습니다. 활동 만들기 또는 시작 (각각) 중에도 계속 호출됩니다.
따라서 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;
            }
        });

내가 생각하는 가장 좋은 방법은 flagitemselected = 0; oncreate에서. 그리고 항목 선택 이벤트 증분 그 깃발 ie flagitemselected ++; 그리고 나서 (flagitemselected! = 1) {// 여기에서 당신의 일을하세요.} 이것이 내가 도움이 될 것 같아요.


내가 찾은 한 가지 트릭은 setOnItemSelectedListeners를 onCreate 대신 onWindowFocusChanged에 넣는 것입니다. 나는 이런 방식으로 나쁜 부작용을 발견하지 못했다. 기본적으로 윈도우가 그려진 후에 리스너를 설정하십시오. onWindowFocusChanged가 얼마나 자주 실행되는지는 잘 모르겠지만 너무 자주 실행되는 경우 잠금 변수를 작성하기는 쉽습니다.

안드로이드는 메시지 기반 처리 시스템을 사용하고 있으며 onCreate에 모두 넣으면 회 전자가 그려진 후 회전자가 채워지는 상황이 발생할 수 있습니다. 따라서 항목 위치를 설정하면 청취자가 꺼집니다. 이것은 교육받은 추측이지만 당연히이 점을 바로 잡으십시오.


이전 답변 중 일부가 올바르지 않습니다. 그들은 다른 위젯과 뷰에서 작동하지만 Spinner 위젯 의 설명서에는 다음과 같이 명시되어 있습니다.

회 전자는 항목 클릭 이벤트를 지원하지 않습니다. 이 메소드를 호출하면 예외가 발생합니다.

대신에 OnItemSelectedListener() 를 더 잘 사용 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() 메서드 호출 내부에 배치하는 것이 좋습니다.


현재 스피너 선택을위한 전역 변수 가져 오기 :

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>

회 전자 이름을 찾고 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
    }
});

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

OnItemSelectedListener ()가 간단한 검사로 호출되는 것을 피할 수 있습니다. 현재 선택 인덱스를 정수 변수에 저장하고 아무것도 수행하기 전에 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 이 작동하려면 개체 범위에 있어야합니다!


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
            }
        );

spinner1.setOnItemSelectedListener(
    new AdapterView.OnItemSelectedListener() {
        //add some code here
    }
);




spinner